Rei*_*ill 6 encryption ios swift swift3
我要提前说一下,我对密码学(对基础知识)了解不多。我正在尝试实施凭据OpenHome服务,并且想对密码进行加密以将其发送到设备。
设备提供了用C编写的函数,该函数返回如下所示的公共密钥String:
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCzjFGuEKD0uWxzb47oRbiSP2uDwVJPeWU7m9VXi626V6lameTzdtwj2eYVZTIAsAW7yW4or2skn7oHqFG4GvhMzgMwoQjKFxeCPPFXRSotnt26AN1DhvFJp3V/d+MpmkzI07iWcD5eNe4EVNK9GSE4JOEHhJ/JYBVMiu04XE5aqwIDAQAB
Run Code Online (Sandbox Code Playgroud)
Android实现已经完成,给出的规范是
具有SHA-256和MGF1填充的RSA / ECB / OAEP
还有一个网站在加密时提供“说明”
http://wiki.openhome.org/wiki/Av:Developer:CredentialsService
到目前为止,我已经尝试过这些库:
SwiftyRSA,Heimdall,SwCrypt
我真的觉得我的主要失败之一是我不了解自己拥有的东西,我需要什么以及最终如何使用swift快速实现它。
理想情况下,我将具有如下功能
func encryptMessage(message:String, whithPublicKey key:String)->String
Run Code Online (Sandbox Code Playgroud)
非常感谢你。
经过长时间的研究,我刚刚实施了自己的解决方案,而不是使用库,也不了解发生了什么。知道会发生什么总是好的,在这种情况下,这不是火箭科学。
在 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")
}
Run Code Online (Sandbox Code Playgroud)
此外,如果您想要在 iOS 10 之前,您可以使用以下功能:
func SecKeyEncrypt(_ key: SecKey,
_ padding: SecPadding,
_ plainText: UnsafePointer<UInt8>,
_ plainTextLen: Int,
_ cipherText: UnsafeMutablePointer<UInt8>,
_ cipherTextLen: UnsafeMutablePointer<Int>) -> OSStatus
Run Code Online (Sandbox Code Playgroud)
和
func SecKeyDecrypt(_ key: SecKey,
_ padding: SecPadding,
_ cipherText: UnsafePointer<UInt8>,
_ cipherTextLen: Int,
_ plainText: UnsafeMutablePointer<UInt8>,
_ plainTextLen: UnsafeMutablePointer<Int>) -> OSStatus
Run Code Online (Sandbox Code Playgroud)
但是这些提供的选择较少,而且非常受限制。
值得一提的是,我的公钥和私钥在 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");
}
Run Code Online (Sandbox Code Playgroud)
和
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");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2884 次 |
| 最近记录: |