【问题标题】:Importing an Objective-C RSA public key into c# RSACryptoServiceProvider将 Objective-C RSA 公钥导入 c# RSACryptoServiceProvider
【发布时间】:2013-07-31 02:16:18
【问题描述】:

这是我们使用以下库生成 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 之间交换公钥的任何方法。这只是我们迄今为止最接近的一次。

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 不起作用,我们都很好奇。

【问题讨论】:

  • isuse 可能是执行的填充。很可能目标 C 使用 PKCS#1 v1.5 兼容加密,而 C# 使用 PCKS#1 v2.1 OAEP 兼容加密。请注意,加密使用随机填充,因此输出不同的事实并不奇怪;它意味着不同。请向我们展示用于加密明文的代码...
  • 关于 Edit3:您是否还检查了 C# 和目标 C 都使用了哪个哈希函数?
  • @owlstead 我在哪里可以找到这些信息?
  • 我的同事告诉我,它是 NSDATA,虽然是加密的,但随后会以 base-64 格式转换为 NSString。我对obj-c不太熟悉
  • 好的,所以 C# 中的 OAEP 使用 SHA-1。现在为目标 C...

标签: c# objective-c encryption rsa


【解决方案1】:

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

我认为这可能会有所帮助

为了简短起见,请尝试使用 temp.Modulus.ToByteArrayUnsigned()

【讨论】:

    【解决方案2】:

    我使用 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;
        }
    

    【讨论】:

    • 但是你生成的privateKey不是XML格式。如何在 .NET cspDecryption.FromXmlString() 中使用它?
    猜你喜欢
    • 2016-08-16
    • 2011-05-11
    • 1970-01-01
    • 2014-07-07
    • 2021-10-24
    • 2017-04-10
    • 2015-02-28
    • 2017-02-06
    相关资源
    最近更新 更多