一个Rsa混合Ascill的编码方案
Posted 明立
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个Rsa混合Ascill的编码方案相关的知识,希望对你有一定的参考价值。
一个以Rsa加密算法为核心,以acill码为外层封装的简单混合编码方案:
加密思路:
- 1.将输入的明文,按字节转化成对应的acill码,形成数据源
- 2.遍历数据源,生成密文组
- 3.将密文组进行0位填充(代码是3位数,不足三位数前置对应数量的0),使之长度一致,拼接形成密文
解密思路: - 1.密文分解成密文数组(代码里是按3位)
- 2.遍历密文数组,解码,获得明文数据源
- 3.遍历明文数据源,转化成ascill,拼接形成明文
说明:
- 1.代码里面的p和q是随便定下的,如果这个数值有发生变化的话,注意调整0位填充的个数,避免数据丢失
- 2.代码结构可能会显得很混乱,毕竟一开始只是想顺着思路写个Rsa的Demo,没想到后面想到一点补充一点,就。。。你懂的
- 3.有个新信仰,叫CTF,有个新称号,叫菜鸡,所以,代码有需要反馈的地方,烦请指出,毕竟新手上路,这车翻不翻,不在人,在车~
- 4.命名垃圾,结构一般,辛苦各位看官的眼睛了~~
废话完毕,翠花,上代码:
#获取N
def getN(p,q):
return p*q
pass
#获取最大值
def getM(p,q):
if p>q:
return p
return q
#获取最大公倍数
def getLcm(p,q):
a=getM(p,q)
b=p+q-a;
while b!=0:
c=a
a=b
b=int(c%b)
pass
return int(p*q/a)
pass
#判断两数是否互质
def checkGcd(p,q):
a=getM(p,q)
b=p+q-a;
while int(a%b):
c=b
b=int(a%b)
a=c
pass
return b==1
pass
#获取加密E值
def getE(lcm):
for i in range(2,lcm):
if checkGcd(i,lcm):
return i
pass
pass
pass
#获取解密D值
def getD(e,lcm):
for d in range(2,lcm):
if d*e%lcm==1:
return d
pass
pass
pass
#核心:加密
def encrypto(p,q,pwd):
L=getLcm(p-1,q-1)
return pwd ** getE(L) % getN(p,q)
#核心:解密
def decrypto(p,q,enc):
L=getLcm(p-1,q-1)
E=getE(L)
return enc ** getD(E,L) % getN(p,q)
#字符串转数组
def sToI(s):
num=[]
for n in s:
num.append(ord(n))
pass
return num
pass
#数组转字符串
def iToS(num):
s=""
for n in num:
s+=chr(n)
pass
return s
pass
#0位前置填充
def getZero(num):
if num >=100:
return ""
elif num >=10:
return "0"
else:
return "00"
#处理加密后的数据并返回
def Doenc(p,q,pwds):
encs=[]
s=""
for pwd in pwds:
encs.append(encrypto(p,q,pwd))
pass
for enc in encs:
s+=(getZero(enc)+str(enc))
pass
return s;
#处理需要解密的数据并返回数据源
def Dodec(enc):
encs=[]
step=3
start=0
end=step
while end <=len(enc):
encs.append(int(enc[start:end]))
start=end
end+=3
pass
return encs
def main():
#p,q,采用的是acill混合rsa的方式,17*19的乘积已经大于acill的范围,可以更改
p=17
q=19
type=input("加密输入0,解密输入1:")
if type == "0":
pwd=input("输入明文:")
pwds = sToI(pwd)
enc = Doenc(p,q,pwds)
print("密文是:",enc)
pass
else:
enc=input("输入密文:")
encs = Dodec(enc.strip())
decs=[]
for enc in encs:
decs.append(decrypto(p,q,enc))
pass
print("明文是",iToS(decs))
pass
pass
if __name__ == "__main__":
main()
pass
以上是关于一个Rsa混合Ascill的编码方案的主要内容,如果未能解决你的问题,请参考以下文章