簡體   English   中英

加密 RSA/ECB/OAEPWithSHA-256AndMGF1Padding Swift

[英]Encrypt RSA/ECB/OAEPWithSHA-256AndMGF1Padding Swift

我要提前說我不太了解密碼學(僅限基礎)。 我正在嘗試實施憑證 OpenHome 服務,並且我想加密密碼以將其發送到設備。

該設備提供了一個用 C 編寫的函數,該函數返回一個公鑰字符串,如下所示:

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCzjFGuEKD0uWxzb47oRbiSP2uDwVJPeWU7m9VXi626V6lameTzdtwj2eYVZTIAsAW7yW4or2skn7oHqFG4GvhMzgMwoQjKFxeCPPFXRSotnt26AN1DhvFJp3V/d+MpmkzI07iWcD5eNe4EVNK9GSE4JOEHhJ/JYBVMiu04XE5aqwIDAQAB

Android 實現已經完成,給出的規范是

RSA/ECB/OAEPWithSHA-256AndMGF1Padding

還有一個網站在加密時給出“說明”

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

到目前為止,我已經嘗試過這些庫:

SwiftyRSA、海姆達爾、SwCrypt

我真的認為我的主要失敗之一是我不明白我擁有什么,我需要什么以及最終如何使用 swift 實現它。

理想情況下,最后我會有一個像

func encryptMessage(message:String, whithPublicKey key:String)->String

非常感謝你。

經過長時間的研究,我剛剛實施了自己的解決方案,而不是使用庫,也不了解發生了什么。 知道會發生什么總是好的,在這種情況下,這不是火箭科學。

在 iOS 上,如果您想加密/解密,您需要使用存儲在鑰匙串上的密鑰。 就我而言,如果我獲得了公鑰,我可以將其導入,也可以對私鑰執行相同操作。 在此處查看我的 HelperClass。

然后,僅從 iOS 10 開始,您可以調用這 2 種加密和解密方法

        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");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM