这里是Objective-C中,我们使用的是使用下面的LIB生成RSA对象:https://github.com/kuapay/iOS-Certificate--Key--and-Trust-Sample-Project导入Objective-C的RSA公钥到C#的RSACryptoServiceProvider
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之间交换公钥的任何方法。这只是我们迄今为止最接近的。
EDIT2: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);
OBJ-C
NSString *encrypted = [rsa encrypt:@"1234567890" key:RSAKeyPair.publicKey error:error];
最后编辑:
使用.NET服务器上的奇尔卡特加密库解决。现在我们可以从一个.NET,Java或Objective-C客户端生成的XML和PEM格式的公钥加载RSA加密器。如果有人可以解释为什么.NET RSACryptoServiceProvider不起作用,我们都很好奇。
的isuse可能进行填充。目标C很可能使用PKCS#1 v1.5兼容加密,并且C#使用PCKS#1 v2.1 OAEP兼容加密。请注意,加密使用随机填充,所以输出不同的事实并不令人惊讶;它意味着不同。请向我们展示用于加密明文的代码... –
关于Edit3:你是否还检查过C#和目标C都使用了哪一个哈希函数? –
@owlstead我在哪里可以找到这些信息? – Julien