将Objective-C RSA公钥导入c#RSACryptoServiceProvider

时间:2013-07-30 19:10:28

标签: c# objective-c encryption rsa

以下是我们用于使用以下lib生成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传递给使用BouncyCastles库的c#:

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服务器上的Chilkat加密库解决。我们现在能够从.NET,Java或Objective-C客户端生成的XML和PEM格式的公钥加载RSA加密器。如果有人能解释为什么.NET RSACryptoServiceProvider不起作用,我们都很好奇。

2 个答案:

答案 0 :(得分:0)

请检查我对自己问题的回答 RSA C# encryption with public key to use with PHP openssl_private_decrypt(): Chilkat, BouncyCastle, RSACryptoServiceProvider

我认为这可能会有所帮助

要缩短它,请尝试使用temp.Modulus.ToByteArrayUnsigned()

答案 1 :(得分:0)

我使用CommonCrypto编写了RSA和AES实现,实现是为了与.NET互操作

检查出来

https://github.com/ozgurshn/EncryptionForiOS

我使用了base64编码

.NET端可能是

 public string RsaDecryption(byte[] cipherText, string privateKey)
    {
        var cspDecryption = new RSACryptoServiceProvider();

        cspDecryption.FromXmlString(privateKey);

        var bytesPlainTextData = cspDecryption.Decrypt(cipherText, false);

        return Encoding.UTF8.GetString(bytesPlainTextData);
    }

public byte[] RsaEncryption(string plainText, string publicKey)
    {
        var cspEncryption = new RSACryptoServiceProvider();

        cspEncryption.FromXmlString(publicKey);

        var bytesPlainTextData = Encoding.UTF8.GetBytes(plainText);
        var bytesCypherText = cspEncryption.Encrypt(bytesPlainTextData, false);

        return bytesCypherText;
    }