现实中会有很多需求,对数据加密是其中一种。我们对数据的加密方式有 对称加密 和 不对称加密。对称加密就是使用相同的秘钥和算法加密明文和解密密文。而不对称加密,就是有加密和解密使用不同秘钥的算法,其中对外公开的叫 公钥(public key),不公开的叫 密钥(private key)。本文中要提到的 RSA 算法就是一种不对称加密算法。
RSA 介绍
关于 RSA, 详细介绍 请看这里。
这里做个大白话来解释,RSA 是一个配有两把钥匙的“锁”。一般情况下使用公开的钥匙(public key)来把数据锁住,然后另外一个不公开的钥匙 (private key)开锁来得到数据。
RSA 秘钥生成
上面提到RSA 是不对称算法,它有 public key 和 private key,下面我们用 openssl 来生成它们。下面使用 OSX 系统上自带的 openssl 来生成秘钥。
➜ ~ openssl
OpenSSL> genrsa -out rsa_private_key.pem 1024
Generating RSA private key, 1024 bit long modulus
……….++++++
……………………++++++
e is 65537 (0x10001)
OpenSSL> pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
—–BEGIN PRIVATE KEY—–
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKGhqNRI8ygdZcsW
FofWo0+ERSJSQDIjDCrkWlDkKmQP3miYs0ARb00ik95z3IIRp0NCSmDJMRS2Gjdj
jNXlHNLZOw05OtH+47Hi3IGmi+dFDzPgux4KzXfs5eOXkhLfSR7XQ2ju1A5q6lAw
mXFR8IqEMR73EbwXZM6GHmMC0yglAgMBAAECgYAffJ2mFTwBQZDV+kyTU9XmpK7P
G9TTr44sQOXzQi+b5JeAKtcokPzsuuKxgEKhuAyshpp0tlzwWvVKewMxm/t8LIEq
O7rwk4w/9Hx5CX+gOogOc6HnjEAucUqr9qxBIsKyvt7V+PlZmytnIamnV3GA7fVV
O0APf1DtkU30eGnlAQJBAM2UMpOBwvBchWiYymnRtCyCf7qPGrbNb748a12Ca9Fc
eEqdH3FQGBSAUX2xij6exhGAHVPCIfwe9p+A2UTFMGUCQQDJRhwjZ0gnec8pjECX
hzaulzsu96ypXZltYaOsArP3pnrD4VzNy8aaplgwMXPBl3/sDyAQkRiLg4ExUUk1
ajzBAkB9EZ8fbH9ree5T7zid3k2uEoqgtjU7Z4qHAv0Su6jai1ZHloWti1vLBTIO
tTd012WK+hVdgqroVvIVoe8MzqadAkEAnD0RMKZGy2Xx2uWlajqqxuJcLbxSynH+
3Hqzq525h98yYwV4ncO2GmxP/rEUk02AHoUrNdD8BaiCS/82XgFmwQJAdCbcdxFK
ZUVK3+OCGretEHdedWuVPXEhfiLDpguog994jdoCMCmGviKiOURNo3QsK5DfT0+A
Lw307ILOc1dqcg==
—–END PRIVATE KEY—–
OpenSSL> rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
writing RSA key
OpenSSL>
然后 openssl 会为我们生成两个文件,分别叫做 rsa_private_key.pem 和 rsa_public_key.pem。
与 Unity 结合
这里,我们引入一个类叫做 RSACryptoServiceProvider, 它是 .NET 提供的类。需要说明的是,它不能直接使用 openssl 生成的 pem 文件,我们需要转换 pem 到它能使用的格式,也就是 RSAParameters 类。具体算法那如下代码所示:
1 | using System.Security.Cryptography; |
然后我们可以直接调用 RSAHelper.Encript
来加密数据,RSAHelper.Decrypt
解密数据。如下面代码,Encode()
加密 Hello Rocky
字符串,然后 Decode()
解决加密后的字符串。
1 | using UnityEngine; |
本文的代码也可以在这里找到: https://github.com/wudixiaop/UnityRSA。
Enjoy!