首先,服务器跟客户端的数据加密方式,采用了非对称加密,也就是私钥和公钥进行配对。公钥进行加密,私钥进行解密,或者私钥进行加密,公钥进行解密。
对称加密加密解密用同一个秘钥,安全性相对于非对称加密来说低一些。
对称加密用私钥公钥一对秘钥进行加解密,而且秘钥是随机且加密的,安全性相对高一些;
对称加密在效率上比非对称加密要高一些。
一,服务器端生成一对秘钥,公钥和私钥,然后给客户端一份公钥,保存在本地。服务器端保留一份私钥;
二,客户端要传输数据,将数据用公钥进行加密,进行传输,服务端收到数据后用私钥进行解密;
三,服务端要发送数据,将数据用私钥进行加密,发送后,客户端收到数据后用公钥进行解密。
为了更安全起见,客户端在传输时,可以先将数据进行AES加密,然后再通过公钥进行RSA加密进行上传。只不过服务器端收到数据后,先通过私钥进行RSA解密,然后再将数据进行AES解密,得到明文数据。
以上方案,服务端可以先将数据进行AES加密,然后通过私钥进行RSA加密进行传输。客户端收到消息后,先通过公钥进行RSA解密,再将解密的数据进行AES解密,得到明文数据。
iOS终端生成私钥公钥命令:
openssl genrsa -out rsa_private_key.pem 1024 //公钥是通过私钥进行生成的 openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
模拟公钥私钥加解密过程,用了RSA类库:
//data = [RSA stripPrivateKeyHeader:data]; //公钥 NSString *publicFePath = [[NSBundle mainBundle] pathForResource:@"rsa_public_key" ofType:@"pem"]; NSString *publicStr = [[NSString alloc] initWithContentsOfFile:publicFePath encoding:(NSUTF8StringEncoding) error:nil]; //公钥加密 NSString *encrypted = [RSA encryptString:@"你的名字叫什么!" publicKey:publicStr]; NSLog(@"encrypted: %@", encrypted); // //私钥 NSString *privateFePath = [[NSBundle mainBundle] pathForResource:@"rsa_private_key"ofType:@"pem"]; NSString *privateStr = [[NSString alloc] initWithContentsOfFile:privateFePath encoding:(NSUTF8StringEncoding) error:nil]; //私钥解密 NSString *decrypted = [RSA decryptString:encrypted privateKey:privateStr]; NSLog(@"decrypted: %@", decrypted);
附上一张盗用的网图,链接忘记了,着实抱歉。