加密RSA / ECB / OAEPWithSHA-256AndMGF1Padding Swift

时间:2017-11-11 11:43:27

标签: ios swift encryption swift3

我要事先说,我对密码学知之甚少(仅限基础知识)。我正在尝试实现凭据OpenHome服务,我想加密密码以将其发送到设备。

设备提供了一个用C编写的函数,它返回一个如下所示的公钥String:

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCzjFGuEKD0uWxzb47oRbiSP2uDwVJPeWU7m9VXi626V6lameTzdtwj2eYVZTIAsAW7yW4or2skn7oHqFG4GvhMzgMwoQjKFxeCPPFXRSotnt26AN1DhvFJp3V/d+MpmkzI07iWcD5eNe4EVNK9GSE4JOEHhJ/JYBVMiu04XE5aqwIDAQAB

Android实施已经完成,规格是

RSA / ECB / OAEPWithSHA-256AndMGF1Padding

还有一个网站提供"指令"加密时

http://wiki.openhome.org/wiki/Av:Developer:CredentialsService

到目前为止,我已尝试过这些库:

SwiftyRSA,Heimdall,SwCrypt

我真的认为我的主要失败之一是我不了解我所拥有的,我需要什么以及最后如何使用swift来实现它。

理想情况下,我会有像

这样的功能
func encryptMessage(message:String, whithPublicKey key:String)->String
非常感谢你。

1 个答案:

答案 0 :(得分:3)

经过长时间的研究,我刚刚实施了自己的解决方案而不是使用库而不了解发生了什么。知道发生了什么总是好的,在这种情况下,它不是火箭科学。

在iOS上如果要加密/解密,则需要使用存储在钥匙串上的密钥。如果,在我的情况下,我已经获得了公钥,我可以导入它,我也可以使用私钥做同样的事情。请参阅我的HelperClass Here

然后,仅从iOS 10开始,您可以将这两种方法称为加密和解密

        let error:UnsafeMutablePointer<Unmanaged<CFError>?>? = nil
        let plainData = "A Plain text...".data(using: .utf8)
        if let encryptedMessageData:Data = SecKeyCreateEncryptedData(publicSecKey, .rsaEncryptionOAEPSHA256, plainData! as CFData,error) as Data?{
            print("We have an encrypted message")

            let encryptedMessageSigned = encryptedMessageData.map { Int8(bitPattern: $0) }
            print(encryptedMessageSigned)

            if let decryptedMessage:Data = SecKeyCreateDecryptedData(privateSecKey, .rsaEncryptionOAEPSHA256, encryptedMessageData as CFData,error) as Data?{
                print("We have an decrypted message \(String.init(data: decryptedMessage, encoding: .utf8)!)")
            }
            else{
                print("Error decrypting")
            }

        }
        else{
            print("Error encrypting")
        }

此外,如果您想在iOS 10之前使用以下功能:

func SecKeyEncrypt(_ key: SecKey, 
             _ padding: SecPadding, 
             _ plainText: UnsafePointer<UInt8>, 
             _ plainTextLen: Int, 
             _ cipherText: UnsafeMutablePointer<UInt8>, 
             _ cipherTextLen: UnsafeMutablePointer<Int>) -> OSStatus

func SecKeyDecrypt(_ key: SecKey, 
             _ padding: SecPadding, 
             _ cipherText: UnsafePointer<UInt8>, 
             _ cipherTextLen: Int, 
             _ plainText: UnsafeMutablePointer<UInt8>, 
             _ plainTextLen: UnsafeMutablePointer<Int>) -> OSStatus

但是这些选项的选择较少而且它们已经完全没有了。

值得一提的是我的公钥和私钥在android上使用

生成
public static String createStringFromPublicKey(Key key) throws Exception {
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(key.getEncoded());
return new String(Base64.encode(x509EncodedKeySpec.getEncoded(), Base64.NO_WRAP), "UTF-8");

}

public static String createStringFromPrivateKey(Key key) throws Exception {
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(key.getEncoded());
return new String(Base64.encode(pkcs8EncodedKeySpec.getEncoded(), Base64.NO_WRAP), "UTF-8");

}