一个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的编码方案的主要内容,如果未能解决你的问题,请参考以下文章

DES和RSA混合加密&解密

DES和RSA混合加密&解密

DES和RSA混合加密&解密

Android接口安全 - RSA+AES混合加密方案

Python 基础 - Day 2 Learning Note - 字符转编码操作

在 Java 中生成 PKCS#1 格式的 RSA 密钥