这是我们使用以下库生成 RSA 对象的 Objective-C:https ://github.com/kuapay/iOS-Certificate--Key--and-Trust-Sample-Project
BDRSACryptor *rsa = [[BDRSACryptor alloc] init];
BDRSACryptorKeyPair *RSAKeyPair = [rsa generateKeyPairWithKeyIdentifier:nil error:error];
然后我们传递RSAKeyPair.publicKey
给我们的 c#,在其中使用 BouncyCastles 库:
using (TextReader sr = new StringReader(pempublic))
{
var pemReader = new PemReader(sr);
var temp = (RsaKeyParameters)pemReader.ReadObject();
var RSAKeyInfo = new RSAParameters
{
Modulus = temp.Modulus.ToByteArray(),
Exponent = temp.Exponent.ToByteArray()
};
var rsaEncryptor = new RSACryptoServiceProvider();
rsaEncryptor.ImportParameters(RSAKeyInfo);
}
没有错误,但加密不同。在c#和obj-c中加密的同一个字符串是不同的,我们无法一边加密一边解密。
帮助!
编辑:愿意考虑在 c# 和 obj-c 之间交换公钥的任何方法。这只是我们迄今为止最接近的一次。
编辑2:内容pempublic
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/ugxekK+lY0VLeD8qA5nEhIn7IzBkgcrpiEM109chFxHobtvWEZbu8TqTIBtIgtISNp4idcEvahPniEyUawjmRSWB7uYmcHJ3pWaIo5/wBthmGrqS/XjedVXT6RuzaoPf9t0YXyW6YiH1kQZn4gjZF51O6iIk2+VnfkYVqeKBtQIDAQAB-----END PUBLIC KEY-----
Edit3:关于填充:C# 和 obj-c 都使用 OEAP 填充。
Edit4:如何加密文本:c#
byte[] testBytes = Encoding.UTF8.GetBytes("1234567890");
byte[] encryptedBytes = rsaEncryptor.Encrypt(testBytes, true);
string base64 = Convert.ToBase64String(encryptedBytes);
对象-c
NSString *encrypted = [rsa encrypt:@"1234567890" key:RSAKeyPair.publicKey error:error];
最终编辑:
通过使用 .NET 服务器上的 Chilkat 加密库解决。我们现在能够从 .NET、Java 或 Objective-C 客户端生成的 XML 和 PEM 格式的公钥加载 RSA 加密器。如果有人能解释为什么 .NET RSACryptoServiceProvider 不起作用,我们都很好奇。