加密RSA/ECB/OAEPWithSHA-256AndMGF1Padding Swift

加密RSA/ECB/OAEPWithSHA-256AndMGF1Padding Swift

问题描述:

我要提前说我对加密技术不了解太多(仅限基础知识)。我正在尝试实施Credential OpenHome服务,并且想要加密密码以将其发送到设备。加密RSA/ECB/OAEPWithSHA-256AndMGF1Padding Swift

该设备提供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 

非常感谢你。

+0

不知道你的错误或障碍就是我的公钥和私钥,其中android上产生!该过程看起来像需要使用ECB分组密码和OAEP填充中的RSA服务器共享的公钥来生成密码的加密消息并将其发送回服务器。 OAEPWithSHA-256AndMGF1Padding是非常不寻常的,所以只需检查哪些库支持这一点。 – carbonr

+0

公钥由服务器给出。所以我假设服务器有一个用于解密消息的私钥。我想知道如何使用提供的公钥和规范来加密邮件。 –

+0

“我到目前为止试过这些图书馆......”和?什么地方出了错?你的代码在哪里尝试? –

经过长时间的研究,我刚刚实现了我自己的解决方案,而不是使用库并且不理解发生了什么。知道会发生什么总是件好事,而这种情况并非火箭科学。

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

然后,从只能从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 

但是,这些给予较少的选项,他们相当抢手。

值得一提的是,使用

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

}