RSA加密的限制

加密的明文长度不能超过  (RSA密钥的长度-11),比如1024位的,明文长度不能超过117。
密文的长度总是密钥的长度的一半,比如1024位的,密文长度是64,如果是1032位,密文长度是65位
1024位=1024bit=128byte,128-11=117。
RSA加密内容的长度有限,和密钥长度有关,这是它的算法决定的。不过一般可以用RSA加密其他算法的密钥,比如用RSA加密DES的密钥,再用DES算法加密明文数据。
RSA一般还是用来签名比较多,如果只是签名用的话,加密明文的MD5值就可以了

java中默认填充方式是RSA/ECB/PKCS1Padding,Cipher.getInstance("RSA/ECB/PKCS1Padding");android不是
java
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
android
Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");
在服务端和客户端都使用 Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");即可
参考:
http://stackoverflow.com/questions/6069369/rsa-encryption-difference-between-java-and-android
http://stackoverflow.com/questions/2956647/rsa-encrypt-with-base64-encoded-public-key-in-android

各种 padding 对输入数据长度的要求:
私钥加密:
RSA_PKCS1_PADDING RSA_size-11
RSA_NO_PADDING RSA_size-0
RSA_X931_PADDING RSA_size-2
公钥加密
RSA_PKCS1_PADDING RSA_size-11
RSA_SSLV23_PADDING RSA_size-11
RSA_X931_PADDING RSA_size-2
RSA_NO_PADDING RSA_size-0
RSA_PKCS1_OAEP_PADDING RSA_size-2 * SHA_DIGEST_LENGTH-2
  1. #include
  2. #include
  3. int main()
  4. {
  5. RSA *r;
  6. int bits=1024,ret,len,flen,padding,i;
  7. unsigned long e=RSA_3;
  8. BIGNUM *bne;
  9. unsigned char *key,*p;
  10. BIO *b;
  11. unsigned char from[500],to[500],out[500];
  12. bne=BN_new();
  13. ret=BN_set_word(bne,e);
  14. r=RSA_new();
  15. ret=RSA_generate_key_ex(r,bits,bne,NULL);
  16. if(ret!=1)
  17. {
  18. printf("RSA_generate_key_ex err!\n");
  19. return -1;
  20. }

  21. b=BIO_new(BIO_s_mem());
  22. ret=i2d_RSAPrivateKey_bio(b,r);
  23. key=malloc(1024);
  24. len=BIO_read(b,key,1024);
  25. BIO_free(b);
  26. b=BIO_new_file("rsa.key","w");
  27. ret=i2d_RSAPrivateKey_bio(b,r);
  28. BIO_free(b);
  29. 116




  30. flen=RSA_size(r);
  31. printf("please select private enc padding : \n");
  32. printf("1.RSA_PKCS1_PADDING\n");
  33. printf("3.RSA_NO_PADDING\n");
  34. printf("5.RSA_X931_PADDING\n");
  35. scanf("%d",&padding);
  36. if(padding==RSA_PKCS1_PADDING)
  37. flen-=11;
  38. else if(padding==RSA_X931_PADDING)
  39. flen-=2;
  40. else if(padding==RSA_NO_PADDING)
  41. flen=flen;
  42. else
  43. {
  44. printf("rsa not surport !\n");
  45. return -1;
  46. }
  47. for(i=0;i
  48. memset(&from[i],i,1);
  49. len=RSA_private_encrypt(flen,from,to,r,padding);
  50. if(len<=0)
  51. {
  52. printf("RSA_private_encrypt err!\n");
  53. return -1;
  54. }
  55. len=RSA_public_decrypt(len,to,out,r,padding);
  56. if(len<=0)
  57. {
  58. printf("RSA_public_decrypt err!\n");
  59. return -1;
  60. }
  61. if(memcmp(from,out,flen))
  62. {
  63. printf("err!\n");
  64. return -1;
  65. }

  66. printf("please select public enc padding : \n");
  67. printf("1.RSA_PKCS1_PADDING\n");
  68. 117
  69. printf("2.RSA_SSLV23_PADDING\n");
  70. printf("3.RSA_NO_PADDING\n");
  71. printf("4.RSA_PKCS1_OAEP_PADDING\n");
  72. scanf("%d",&padding);
  73. flen=RSA_size(r);
  74. if(padding==RSA_PKCS1_PADDING)
  75. flen-=11;
  76. else if(padding==RSA_SSLV23_PADDING)
  77. flen-=11;
  78. else if(padding==RSA_X931_PADDING)
  79. flen-=2;
  80. else if(padding==RSA_NO_PADDING)
  81. flen=flen;
  82. else if(padding==RSA_PKCS1_OAEP_PADDING)
  83. flen=flen-2 * SHA_DIGEST_LENGTH-2 ;
  84. else
  85. {
  86. printf("rsa not surport !\n");
  87. return -1;
  88. }
  89. for(i=0;i
  90. memset(&from[i],i+1,1);
  91. len=RSA_public_encrypt(flen,from,to,r,padding);
  92. if(len<=0)
  93. {
  94. printf("RSA_public_encrypt err!\n");
  95. return -1;
  96. }
  97. len=RSA_private_decrypt(len,to,out,r,padding);
  98. if(len<=0)
  99. {
  100. printf("RSA_private_decrypt err!\n");
  101. return -1;
  102. }
  103. if(memcmp(from,out,flen))
  104. {
  105. printf("err!\n");
  106. return -1;
  107. }
  108. printf("test ok!\n");
  109. RSA_free(r);
  110. return 0;
  111. }
复制代码
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PHP RSA 加密是一种非对称加密算法,它使用一对公钥和私钥对数据进行加密和解密。公钥用来加密数据,私钥用来解密数据。使用 PHP 实现 RSA 加密可以使用 openssl 扩展库,该库提供了多种 RSA 算法的实现,并可以方便地生成公钥和私钥。例如下面这段代码可以生成一对公钥和私钥 ``` <?php // 生成公钥和私钥 $res = openssl_pkey_new(); // 提取私钥 openssl_pkey_export($res, $privKey); // 提取公钥 $pubKey = openssl_pkey_get_details($res); $pubKey = $pubKey["key"]; // 使用公钥加密数据 $data = "hello world"; openssl_public_encrypt($data, $encrypted, $pubKey); // 使用私钥解密数据 openssl_private_decrypt($encrypted, $decrypted, $privKey); echo $decrypted; ``` ### 回答2: PHP中的RSA加密是一种非对称加密算法,它支持公钥加密和私钥解密的过程。RSA加密的主要步骤如下: 1. 生成密钥对:首先,通过调用PHP的openssl扩展库中的函数生成RSA密钥对,包括公钥和私钥。通常,公钥用于加密数据,私钥用于解密数据。 2. 加密数据:在使用RSA加密之前,需要将待加密数据转换为字节流,并且需要使用公钥进行加密。可通过`openssl_public_encrypt`函数来实现数据的加密。 3. 解密数据:在使用RSA解密之前,需要将密文转换为字节流,并且需要使用私钥进行解密。可通过`openssl_private_decrypt`函数来实现数据的解密。 需要注意的是,RSA加密算法对输入数据的长度限制,通常能够处理的最大数据长度受到密钥长度限制。因此,对于需要加密的数据较大的情况,可以使用对称加密算法(如AES)对数据进行加密,再使用RSA加密对称加密的密钥。 此外,为了确保数据的安全性,我们还可以对RSA密钥进行保护,如设置密钥密码、存储密钥的文件权限等。 总之,PHP中的RSA加密提供了一种可靠的非对称加密方式,可以用于保护敏感数据的安全传输。 ### 回答3: RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,常用于数据加密和数字签名。PHP中有一些库和函数可以用来实现RSA加密。 首先,我们需要生成一对RSA密钥。可以使用openssl库中的openssl_pkey_new()函数来生成一个新的密钥对,并使用openssl_pkey_export()函数将其导出为字符串格式。这样我们就得到了一个私钥和一个公钥。 然后,我们可以使用openssl_public_encrypt()函数使用公钥对要加密的数据进行加密。这个函数将返回一个加密后的字符串,在解密时需要使用私钥进行解密。 最后,我们可以使用openssl_private_decrypt()函数使用私钥对加密后的数据进行解密。这个函数将返回解密后的原始数据。 下面是一个使用RSA加密的简单示例: ```php // 生成RSA密钥对 $res = openssl_pkey_new(); openssl_pkey_export($res, $private_key); $public_key = openssl_pkey_get_details($res)['key']; // 要加密的数据 $data = 'Hello, World!'; // 使用公钥加密数据 openssl_public_encrypt($data, $encrypted, $public_key); // 使用私钥解密数据 openssl_private_decrypt($encrypted, $decrypted, $private_key); // 输出解密后的数据 echo $decrypted; // Hello, World! ``` 这是一个简单的示例,实际使用中可能需要更复杂的逻辑来处理数据的加密和解密。此外,还应该注意保护好私钥,确保只有授权的人才能访问私钥,以防止数据被非法解密。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值