公钥加密算法-RSA

RSA算法

RSA算法是由它的三位开发者,即 Ron Rivest、Adi Shamir 和 Leonard Adleman 的姓氏的首字母组成的 (Rivest-Shamir-Adleman)。
RSA 可以被用于公钥加密、数字签名和密钥交换。



一、简介

RSA算法是非对称加密算法。了解RSA算法之前需要了解素数的概念。
素数:只能被1和本身整除的数。如:13,19…
RSA算法数学难题:两个大素数相乘容易,素数相乘的乘积分解比较难。
RSA算法中间涉及到数论的一些知识。RSA算法的流程理解起来是比较简单的。实际的难度在于RSA选择和生成的私钥与公钥。


二、RSA算法流程

  1. 选择两个大素数,p、q(这里的p和q不能太小,太小容易被破解,太大计算时间比较长)
  2. n=p*q。Φ(n) = (p-1)(q-1)(这里的Φ(n)是欧拉函数:Φ(n)的值为小于n且与n互质的个数)
  3. 选择一个公钥e(1<e<Φ(n)),e不是p-1与q-1的因子。gcd(e,(p-1)(q-1))=1(e与Φ(n)互素)
  4. 私钥d:(d*e)mod(p-1)(q-1)=1
  5. 加密(密文:c,明文:p):c=p^e modn。公钥(n,e)
  6. 解密:p=c^dmodn。私钥(p,q,d)

1、 加密或者验签过程

明文先转换为比特串分组,使每个分组对应的十进制数小于n,即分组长度小于log2n,然后对每个明文分组mi 作加密运算,具体过程如下。

  1. 获得接收公钥(e,n)。
  2. 把消息M分组长度为(L<log2n)的消息组M=m1m2m3…mt。
  3. 使用加密算法ci=mi^e mod n(l≤i≤t),计算出密文c=c1c2…ct

公钥指数e的长度比较短,因此可以提高解密和验签的速度

2、解密或者签名过程

  1. 将密文c按长度L分组得c=c1 c2…ct。
  2. 使用私钥d和解密算法mi=ci^d mod n(l≤i≤t)计算mi。
  3. 得明文消息M=m1m2m3…mt。

RSA算法加解密
RSA算法流程图


三、RSA算法密钥长度

RSA密钥长度有:1024、2048、3072、7680、15360(单位都是bit)。1024位的密钥已经不安全了。密钥长度越长安全性则越高。RSA算法推荐的密钥长度为2048位。

四、RSA的数学难题

RSA公开密钥密码体制的原理是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积(即上面的n是公开的)公开作为加密密钥。RSA的安全性依赖于大数分解。

参考文章如下: 翱游公钥密码算法

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
JMeter支持RSA公钥加密算法,可以使用Java Cryptography Extension (JCE)提供的RSA算法。以下是使用JMeter进行RSA公钥加密的步骤: 1. 首先,需要将公钥文件导入到JMeter中。在JMeter的“Test Plan”中,右键单击“Add”->“Config Element”->“Keystore Configuration”,然后在“Keystore Configuration”中选择“JKS”作为“Keystore Type”,并指定公钥文件的路径和密码。 2. 接下来,在JMeter的“Test Plan”中,右键单击“Add”->“Sampler”->“Debug Sampler”,然后在“Debug Sampler”中输入要加密的明文。 3. 在“Debug Sampler”中,添加一个“JSR223 Sampler”,并在“Script Language”中选择“groovy”。然后在“Script”中输入以下代码: ```groovy import java.security.KeyFactory; import java.security.spec.RSAPublicKeySpec; import javax.crypto.Cipher; import java.nio.charset.StandardCharsets; import java.util.Base64; String publicKey = vars.get("publicKey"); // 从变量中获取公钥 String plainText = vars.get("plainText"); // 从变量中获取明文 byte[] publicKeyBytes = Base64.getDecoder().decode(publicKey); // 将公钥字符串解码为字节数组 RSAPublicKeySpec keySpec = new RSAPublicKeySpec(publicKeyBytes, new byte[]{1,0,1}); // 构造公钥规范 KeyFactory keyFactory = KeyFactory.getInstance("RSA"); // 获取RSA密钥工厂 Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); // 获取RSA加密器 cipher.init(Cipher.ENCRYPT_MODE, keyFactory.generatePublic(keySpec)); // 初始化加密器 byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8)); // 加密明文 String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes); // 将加密后的字节数组编码为字符串 vars.put("encryptedText", encryptedText); // 将加密后的密文保存到变量中 ``` 4. 在“JSR223 Sampler”中,添加一个“View Results Tree”,并运行测试计划。在“View Results Tree”中,可以查看加密后的密文。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值