RSA加密

心已入冬 提交于 2020-11-08 07:53:22

  今天头疼了一下午心情非常不美好,所以什么都不想干,找点好玩的RSA加密嘻嘻嘻。。。就找到了一个视频

HASH算法:

特点:对于相同的数据加密结果是一样的,不同的数据加密的长度是一样的,没有办法进行逆运算。

也被称为数据指纹。

通过散列碰撞解密,

企业级的开发中:用户密码服务器保存的是密码的HASH值。这个老师讲的不太好,用户密码加严,

可以对每一个用户加一个随机key然后再加密,有一个随机hash算法是hmac,对每一个密码都有一个key进行加密

用户注册账号密码客户端会把密码转换成hash值然后上传服务器,服务器保存,在传递的过程中账号和hash值,

黑客可以抓包拦截数据包,呃,30分钟的视频20分钟没有说到说好的RSA加密算法,行吧,还是自己看吧

费马小定理:假设a是一个整数,p是一个素数,a的p次方减去a一定是p的倍数,验证方式杨辉三角。

RSA算法是一个关于素数的应用,

欧拉φ函数又称为欧拉总计函数,φ(n)其中n是正整数,φ(n)表示在小于或者等于n的正整数当中,与n互素的数的个数。

互素也叫互质,如果两个整数的最大公约数是1则称为它们互素。如果n是一个素数,那么φ(n)=n-1,是这个函数的一个基本性质。

 

 

 

 用python 实现一下吧

class RSA:
    """
    RSA加密算法
    """

    def __init__(self):
        self.__create_key()
        pass

    def rsa_encrypt(self, plain_text):
        # 加密 plain_text < n
        return self.__quick_pow_mod(plain_text, self.__e, self.__n)

    def rsa_decrypt(self, cipher_text):
        # 解密
        return self.__quick_pow_mod(cipher_text, self.__d, self.__n)

    @staticmethod
    def __create_prime_list():
     

        l = list(range(2, 10000))
        for n, i in enumerate(l):
            for j in l[n + 1:]:
                if j % i == 0:
                    l.remove(j)
        return l

    def get_public_key(self):
         
        return "自动生成公钥对:{%d, %d}" % (self.__e, self.__n)

    def get_private_key(self):
      
        return "自动生成私钥对:{%d, %d}" % (self.__d, self.__n)

    def __gcd_x_y(self, x, y):
       
        if y == 0:
            return x
        else:
            return self.__gcd_x_y(y, x % y)

    @staticmethod
    def __quick_pow_mod(a, b, c):
         
        ans = 1   
        a = a % c  
        while b != 0:
            if b & 1:   
                ans = (ans * a) % c
            b >>= 1  
            a = (a * a) % c   
        return ans

    def __create_key(self):
        prime_list = self.__create_prime_list()
        import random
        # 得到两个素数
        p = prime_list[random.randint(0, len(prime_list) - 1)]
        q = prime_list[random.randint(0, len(prime_list) - 1)]
        self.__fanN = (p - 1) * (q - 1)
        while True:
            self.__e = random.randint(2, self.__fanN)
            if self.__gcd_x_y(self.__e, self.__fanN) == 1:
                break
        for i in range(self.__fanN):
            if i * self.__e % self.__fanN == 1:
                self.__d = i
                break
        self.__n = q * p
        # 得到公钥{e, n} 私钥{d, n}


if __name__ == "__main__":
    rsa = RSA()
    print(rsa.get_public_key())
    print(rsa.get_private_key())
    plain_text = int(input("请输入要加密的明文:"))
    cipher = rsa.rsa_encrypt(plain_text)
    print("%d 经过加密后为:%d" % (plain_text, cipher))
    print("%d 经过解密后为:%d" % (cipher, rsa.rsa_decrypt(cipher)))

 

 有点丑,大概就是这个意思吧。。。。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!