【发布时间】:2016-12-22 00:59:34
【问题描述】:
我正在尝试在 iOS 端加密某些内容并在我的 node.js 服务器上对其进行解密。在服务器上,我正在使用库伪造。我能够在 node.js 上加密并解密它,这很有效。我这样加密:const encryptedPassword = publicKey.encrypt(password, 'RAW'); 并像这样解密:const password = privateKey.decrypt(encryptedPassword, 'RAW');。
现在,我想在我的 iOS 应用程序上加密,而不是在服务器中加密,但仍使用相同的方式解密。我找到了这个库,swift-rsautils。 https://github.com/btnguyen2k/swift-rsautils/blob/master/Swift-RSAUtils/RSAUtils.swift 它有一个叫做encryptWithRSAKey 的函数,这就是我正在使用的。由于是原始加密,我尝试传入填充 SecPaddingNone。但是,不幸的是它不起作用,我无法在服务器上解密。错误信息是无效长度,base64 数据的长度看起来确实大了很多。有谁知道我该如何解决这个问题?
这是我的 iOS 代码:
let dataString = text.dataUsingEncoding(NSUTF8StringEncoding)
let certificateLabel = "certificate"
let certificateRef = self.getCertificateFromKeyChain(certificateLabel)
let certificateData = self.getDataFromCertificate(certificateRef)
let cryptoImportExportManager = CryptoExportImportManager()
let publicKeyRef = cryptoImportExportManager.importPublicKeyReferenceFromDERCertificate(certificateData)
let encryptedData = self.encryptWithRSAKey(data, rsaKeyRef: publicKeyRef!, padding: SecPadding.None)
let base64EncryptedString = encryptedData?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
然后我将这个 base64 加密字符串发送到服务器并尝试使用私钥解密。不幸的是,它不起作用。
【问题讨论】:
-
请不要使用 RAW RSA。这本教科书 RSA 完全不安全。 RSA 需要像 OAEP 这样的安全填充。请记住,RSA 只能加密有限数量的数据。如果要加密大于密钥大小的数据,则需要使用hybrid encryption。
-
是否有理由使用 RSA 非对称加密而不是对称加密,例如 AES 和/或使用 HTTPS?
-
我已经设置好一切来使用 RSA。 RSA 真的那么糟糕吗?
-
假设我知道我在做什么或者只是在做实验。如何在 iOS 上进行 Raw RSA 加密?
-
RSA 的速度要慢得多,并且可以加密的数据被限制为小于密钥大小。等效安全性的密钥要长得多:AES 128 位与 RSA 3072 位等效。 AES 使用一个密钥,而 RSA 使用两个密钥。选择 RSA 的一些原因是需要单独的公钥和私钥以及 PKI(公钥基础设施)。缺乏对 RSA 的迫切需求,请使用 AES。
标签: ios node.js encryption rsa