IOS客户端实现RSA加密

生成密文的长度和明文长度无关,但明文长度不能超过密钥长度
不管明文长度是多少,RSA 生成的密文长度总是固定的。但是明文长度不能超过密钥长度。比如 Java 默认的 RSA 加密实现不允许明文长度超过密钥长度减去 11(单位是字节,也就是 byte)。也就是说,如果我们定义的密钥(我们可以通过 java.security.KeyPairGenerator.initialize(int keysize) 来定义密钥长度)长度为 1024(单位是位,也就是 bit),生成的密钥长度就是 1024位 / 8位/字节 = 128字节,那么我们需要加密的明文长度不能超过 128字节 -11 字节 = 117字节。也就是说,我们最大能将 117 字节长度的明文进行加密,否则会出问题(抛诸如 javax.crypto.IllegalBlockSizeException: Data must not be longer than 53 bytes 的异常)。

同样的道理iOS加密也会有这个问题。

一个比较好的解决办法就是将明文分段加密

在IOS的app登陆模块,用户名和密码如果直接传给后台服务器,很容易被截获并伪造网络请求,

如果利用RSA算法在每个客户端利用公钥解密,服务器端进行私钥解密,即使截获了密码也是无法解密的

在这里只介绍客户端如何对密码进行公钥加密和解密

首先打开终端生成公钥和私钥(要有openSSL工具)

openssl genrsa -out private_key.pem 1024

openssl req -new -key private_key.pem -out rsaCertReq.csr

openssl x509 -req -days 3650 -in rsaCertReq.csr -signkey private_key.pem -out rsaCert.crt

openssl x509 -outform der -in rsaCert.crt -out public_key.der          

openssl pkcs12 -export -out private_key.p12 -inkey private_key.pem -in rsaCert.crt
openssl rsa -in private_key.pem -out rsa_public_key.pem -pubout
 
openssl pkcs8 -topk8 -in private_key.pem -out pkcs8_private_key.pem -nocrypt

在第二步的时候输入密钥的信息,包括密码,请记住你输入的密码
上面的命令会生成7个文件,IOS用到的是public_key.der和private_key.p12
导入到项目中不要直接拖拽进去,而是点击Xcode右下角的+号,选择add files to ""

新建项目后添加库:Security.framework

在项目中添加所依赖的文件RSAEncryptor和NSData+Base64在这里下载或联系我1312315229@qq.com
添加RSAEncryptor和NSData+Base64的头文件
实现代码

RSAEncryptor* rsaEncryptor = [[RSAEncryptor alloc] init];
    NSString* publicKeyPath = [[NSBundle mainBundle] pathForResource:@"public_key" ofType:@"der"];
    NSString* privateKeyPath = [[NSBundle mainBundle] pathForResource:@"private_key" ofType:@"p12"];
    [rsaEncryptor loadPublicKeyFromFile: publicKeyPath];
    [rsaEncryptor loadPrivateKeyFromFile: privateKeyPath password:@"1234"];    // 密码
    
    NSString* restrinBASE64STRING = [rsaEncryptor rsaEncryptString:@"你好"];
    NSLog(@"加密后的: %@", restrinBASE64STRING);     //加密
    NSString* decryptString = [rsaEncryptor rsaDecryptString: restrinBASE64STRING];//解密
    NSLog(@"解密后的: %@", decryptString);

输出结果

2016-10-20 16:44:22.455 RSA[10579:458963]
加密后的: trsdtG4vkzsAbMzu4k6HL3NQau6zyvhQDwzfI1OcjiOGENydbEUJ/Rt9xgCmhbaP8VEGC6Zd2ZnBMlNnQ+/YAHvGGfdrdcO9QPwRex2LX38w5ctzDKByYnrEcKI9k3jwNGHepU7E3jNPvQdL89VssP1+vq6GiAqnYVOOCwtlm0U=

2016-10-20 16:44:22.456 RSA[10579:458963] 解密后的: 你好

参考:[http://blog.csdn.net/qq_30513483/article/details/51242338]
参考:[http://blog.csdn.net/sunmenggmail/article/details/11994013]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容