2

これは、次の 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 が機能しない理由を説明できる人がいれば、私たちは皆非常に興味があります。

4

2 に答える 2

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;
    }
于 2015-03-03T21:02:27.473 に答える
0

私自身の質問に対する私の回答を確認してください PHP で使用する公開鍵による RSA C# 暗号化 openssl_private_decrypt(): Chilkat, BouncyCastle, RSACryptoServiceProvider

役立つかもしれないと思います

短くするには、 temp.Modulus.ToByteArrayUnsigned() を使用してみてください

于 2013-12-22T07:53:53.113 に答える