2017-09-23 48 views
0

我正在嘗試加密用戶名和密碼並將其發送到帶有RSA的網站。 我一直在網上搜索,沒有發現任何東西。 我得到從.NET Web服務器的公鑰XML形式是這樣的:使用RSA從Swift加密到C#

<RSAKeyValue> 
<Modulus>vB/j1viHNHdSSnD1JwrZKu93GZtXO/oQAzp90w/QRQC7s7RO4PhTcW3ADOUVB1+BlmbaFsEreNUAOV5P4aZh+68T+InwmU1javFsGkjCcVoQO/uEpp2zjrM9Eh84OPaKH429GVmdfTgUj0YbmYVanM3HX4byMH25DKQD687b7x8= 
</Modulus> 
<Exponent>AQAB</Exponent> 
</RSAKeyValue> 

所以我必須把它與該密鑰加密,我用的XCode 8和斯威夫特3. 使用.NET C·被好簡單。

RSACryptoServiceProvider encryptKey = new RSACryptoServiceProvider(); 
UnicodeEncoding encoding = new UnicodeEncoding(); 
encryptKey.FromXmlString(XML PublicKey); 
byte[] usr = encryptKey.Encrypt(encoding.GetBytes(txtUser.Text),false); 
byte[] pwd = encryptKey.Encrypt(encoding.GetBytes(txtPassword.Text),false); 

¿是否有人可以幫助我? 感謝

修訂

我嘗試這種代碼,但以公鑰是在Mac OS中工作正常生成,但與公鑰我從服務器得到了不工作,我不知道爲什麼? @Charles Srstka

let pubKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDzZtW7ETOkJGTwN/4adYI5oQZ7U7EPzfDtpZTf+cQ9zAcmcC6g6uAC6KuovBSsigcUNzw3s2eNh0RvYBl6ipJ71hH1awTBwVEWo4fl7uIqdpBjwvO1wWXg9UifpvSsV3GPff9YqMvuggDznOGc20CvsXusQKt9dDx8ESxP6yjqiwIDAQAB" 
let keyData = NSData(base64Encoded: pubKey, options: NSData.Base64DecodingOptions.ignoreUnknownCharacters)    
var dict: [NSString: AnyObject] = [ 
     kSecClass: kSecClassKey, 
     kSecAttrKeyType: kSecAttrKeyTypeRSA, 
     kSecAttrKeySizeInBits: pubKey.utf8.count as AnyObject, 
     kSecAttrKeyClass: kSecAttrKeyClassPublic, 
     kSecAttrApplicationTag: "me.lhu" as AnyObject, 
     kSecValueData: keyData as AnyObject, 
     kSecReturnRef: true as AnyObject 
];    
SecItemDelete(dict as CFDictionary) 
var err = SecItemAdd(dict as CFDictionary, nil); 
if ((err != noErr)) { 
    print("error loading public key"); 
}   
var resultData: SecKey? = nil 
var result: AnyObject? 
err = SecItemCopyMatching(dict as CFDictionary, &result) 
if err == noErr, let keyRef as! SecKey {  
    let plaintext = tf_taikhoan.text      
    let plaintextLen = plaintext?.lengthOfBytes(using: String.Encoding.utf8) 
    let plaintextBytes = [UInt8](plaintext!.utf8)      
    var encryptedLen: Int = SecKeyGetBlockSize(keyRef) 
    var encryptedBytes = [UInt8](repeating: 0, count: encryptedLen)      
    err = SecKeyEncrypt(keyRef, SecPadding.PKCS1, plaintextBytes, plaintextLen!, &encryptedBytes, &encryptedLen); 
    if (err != noErr) { 
     print(encryptedBytes); 
    } 
} 
+0

@El番茄我認爲這是他的C#代碼,而不是Swift。 –

+0

我的客戶端是iOS Swift,服務器端是WebAPI C#@CharlesSrstka –

回答

0

如果你可以要求MacOS的10.12或iOS 10,使用SecKey的API:

https://developer.apple.com/library/content/documentation/Security/Conceptual/CertKeyTrustProgGuide/Encryption.html

如果你要支持舊版本的MacOS或iOS的,你可以做加密和解密使用安全變換的MacOS/iOS版,以便您可以在這裏找到的文檔:

https://developer.apple.com/library/content/documentation/Security/Conceptual/SecTransformPG/EncryptionandDecryption/EncryptionandDecryption.html#//apple_ref/doc/uid/TP40010801-CH3-SW1