网络安全_密码学实验_非对称加密算法RSA


一、实验环境

PyCharm 2019.2.4 (Professional Edition) & Python 3.7

二、非对称加密RSA

1.理解RSA算法原理

在这里插入图片描述

2.加密过程

2.1 首先随机生成两个素数p,q(保密)
在这里使用random库就可以生成一个随机数,然后判断是否为一个素数,如果是一个素数,返回True,如果不是,返回False。
在这里插入图片描述2.2 计算n=pq(公开),欧拉函数值f(n) = (p-1)(q-1)(保密)

在这里插入图片描述2.3 随机选取正整数 1<e<f(n),满足gcd(e,f(n))==1
在这里插入图片描述2.4 计算d,满足 d*e≡1(mod f(n))

在这里插入图片描述2.5 由此得到公钥(N,E),私钥(N,D)
2.6 加密变换:对于明文 m∈Zn,密文为c=m^e mod n.
这里使用了大数的幂次取模,将幂指数转换成二进制求解,该算法是由高德纳提出的。算法如下图:

在这里插入图片描述

解密过程

解密变换:对于明文 c∈Zn,明文为m=c^d mod n.
解密过程同样运用了大数的幂次取模,和加密过程的基本原理相同,此处不过多赘述。

#三、 运行结果

运行本程序,显示功能清单,选择RSA加密、RSA解密或者退出。首先,选择1,随机生成两个素数p,q,计算n,f(n),随机选取正整数e,计算d,从而得到公钥和私钥。输入明文(明文长度不受限制),回车,生成密文。
在这里插入图片描述然后,选择2,接着输入私钥,回车,显示明文。最后,选择q,退出。
在这里插入图片描述

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
好的,我可以为您提供一个简单的RSA非对称密码算法的Java实现,代码如下: ```java import java.math.BigInteger; import java.security.SecureRandom; public class RSA { private BigInteger privateKey; private BigInteger publicKey; private BigInteger modulus; private int bitLength = 1024; private SecureRandom random; // 构造函数 public RSA() { random = new SecureRandom(); BigInteger p = BigInteger.probablePrime(bitLength, random); BigInteger q = BigInteger.probablePrime(bitLength, random); BigInteger phi = (p.subtract(BigInteger.ONE)).multiply(q.subtract(BigInteger.ONE)); modulus = p.multiply(q); publicKey = BigInteger.probablePrime(bitLength / 2, random); while (phi.gcd(publicKey).compareTo(BigInteger.ONE) > 0 && publicKey.compareTo(phi) < 0) { publicKey.add(BigInteger.ONE); } privateKey = publicKey.modInverse(phi); } // 获取私钥 public BigInteger getPrivateKey() { return privateKey; } // 获取公钥 public BigInteger getPublicKey() { return publicKey; } // 获取模数 public BigInteger getModulus() { return modulus; } // 加密 public byte[] encrypt(byte[] message) { return (new BigInteger(message)).modPow(publicKey, modulus).toByteArray(); } // 解密 public byte[] decrypt(byte[] message) { return (new BigInteger(message)).modPow(privateKey, modulus).toByteArray(); } } ``` 使用该RSA类进行加密和解密的示例代码如下: ```java public static void main(String[] args) { RSA rsa = new RSA(); // 明文 String message = "Hello, world!"; // 加密 byte[] encryptedMessage = rsa.encrypt(message.getBytes()); // 解密 byte[] decryptedMessage = rsa.decrypt(encryptedMessage); System.out.println("明文: " + message); System.out.println("加密后的密文: " + new String(encryptedMessage)); System.out.println("解密后的明文: " + new String(decryptedMessage)); } ``` 注意:该实现只是一个简单的示例,实际使用中需要加入更多的安全措施,比如添加数字签名等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

手可摘辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值