2013-07-30 27 views
2

這裏是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不起作用,我們都很好奇。

+2

的isuse可能進行填充。目標C很可能使用PKCS#1 v1.5兼容加密,並且C#使用PCKS#1 v2.1 OAEP兼容加密。請注意,加密使用隨機填充,所以輸出不同的事實並不令人驚訝;它意味着不同。請向我們展示用於加密明文的代碼... –

+0

關於Edit3:你是否還檢查過C#和目標C都使用了哪一個哈希函數? –

+0

@owlstead我在哪裏可以找到這些信息? – Julien

回答

0

我寫的RSA和使用CommonCrypto進行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; 
    } 
+1

但您生成的privateKey不是XML格式。如何在.NET中使用它'cspDecryption.FromXmlString()'? – wtf512

相關問題