iOS客户端、java服务器的通信用RSA加密

我的cocoachina发帖

http://www.cocoachina.com/bbs/read.php?tid=166990


openssl实现iOS 和 java服务器端的rsa加密解密。

命令如下

openssl genrsa -out private.key 1024
 
 
openssl rsa -in private.key -pubout -out public.key
 
 
openssl pkcs8 -topk8 -in private.key-out pkcs8_private.key -nocrypt 


iOS 现将openssl加入到工程里面,openssl头文件和libcrypto.a libssl.a
具体可参考OpenSSLRSAWrapper 注意Header Search Paths和 Library Search Paths需要分加入openssl头文件路径和lib路径,参考附件OpenSSLRSAWrapper工程。
服务器将公钥发过来的时候可以选择public.key的文件,这个最简单了,保存文件然后读取就成。
如果想发送public.key文件的内容,那么就在客户端先把内容写入到一个新的public.key的文件在读取。要注意全部内容都要发送过来,而且换行也要标记,否则不能用。

示例。

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDmy13dRbbn0WzH6L4lz6THSFyo
DZWPNwsAOFXXAL22D1mqQ+lpkSQbaDZJiq1JEjbeBTsMmXmB5aPP5nIUv4RWNynt
0YfBmftUJbfy8kVyjG5T4UQb05BGiOQf5eEFANH/PIsk8DHhd5EbxK3xyE8rgtmq
/sXORob0liGnrnJVZwIDAQAB
-----END PUBLIC KEY-----


?
关键代码
写入到文件的
NSString *publicKeyStr = [NSString stringWithFormat:@"-----BEGIN PUBLIC KEY-----\n%@\n%@\n%@\n%@\n-----END PUBLIC KEY-----",
                                 @"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDmy13dRbbn0WzH6L4lz6THSFyo",
                                 @"DZWPNwsAOFXXAL22D1mqQ+lpkSQbaDZJiq1JEjbeBTsMmXmB5aPP5nIUv4RWNynt",
                                 @"0YfBmftUJbfy8kVyjG5T4UQb05BGiOQf5eEFANH/PIsk8DHhd5EbxK3xyE8rgtmq",
                                 @"/sXORob0liGnrnJVZwIDAQAB"];
[publicKeyStr writeToFile:RSAPublickKeyFile atomically:YES encoding:NSASCIIStringEncoding error:&error];


读取public.key的关键代码
#include <openssl/rsa.h>
#include <openssl/pem.h>
 
 
- (void)importRSAKeys
{
    FILE *publicKeyFile;
    RSA *_rsa;
  
    publicKeyFile = fopen([RSAPublickKeyFile cStringUsingEncoding:NSASCIIStringEncoding], "rb");    
  
    if (NULL != publicKeyFile) {
        const char *publicKeyFileName = [RSAPublickKeyFile cStringUsingEncoding:NSASCIIStringEncoding];
        BIO *bpubKey = NULL;
        bpubKey = BIO_new(BIO_s_file());
        BIO_read_filename(bpubKey, publicKeyFileName);
  
        _rsa = PEM_read_bio_RSA_PUBKEY(bpubKey, NULL, NULL, NULL); //PEM_read_RSAPublicKey(file,NULL, NULL, NULL);
        BIO_free_all(bpubKey);
    }
 
 
}




加密、解密的代码,参考附件那个代码吧。
加密代码中那个 RSA_check_key(_rsa); 是不需要的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的示例代码,使用RSA和AES实现客户端服务器端之间的加密通信: 1. 生成RSA密钥对 ```java KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(2048); KeyPair keyPair = keyGen.generateKeyPair(); PrivateKey privateKey = keyPair.getPrivate(); PublicKey publicKey = keyPair.getPublic(); ``` 2. 客户端使用服务器公钥加密AES密钥,并发送给服务器 ```java // 生成AES密钥 KeyGenerator keyGen = KeyGenerator.getInstance("AES"); keyGen.init(256); SecretKey secretKey = keyGen.generateKey(); // 使用服务器公钥加密AES密钥 Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.ENCRYPT_MODE, serverPublicKey); byte[] encryptedKey = cipher.doFinal(secretKey.getEncoded()); // 发送加密后的AES密钥给服务器 OutputStream outputStream = socket.getOutputStream(); outputStream.write(encryptedKey); outputStream.flush(); ``` 3. 服务器端接收加密后的AES密钥,使用私钥解密 ```java // 接收加密后的AES密钥 InputStream inputStream = socket.getInputStream(); byte[] encryptedKey = new byte[256]; inputStream.read(encryptedKey); // 使用私钥解密AES密钥 Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] decryptedKey = cipher.doFinal(encryptedKey); SecretKey secretKey = new SecretKeySpec(decryptedKey, "AES"); ``` 4. 客户端服务器端使用AES密钥加密解密通信数据 ```java // 客户端加密通信数据 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] encryptedData = cipher.doFinal(data); // 服务器解密通信数据 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] decryptedData = cipher.doFinal(encryptedData); ``` 注意:以上代码仅为示例,实际使用时需要考虑更多的安全性和性能方面的问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值