【发布时间】:2021-08-06 12:29:26
【问题描述】:
我有这些 Java 方法需要在 Swift 中实现:
fun encryptMessage(content: String): String {
val cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING")
cipher.init(Cipher.ENCRYPT_MODE, publicKey)
val encryptedBytes = cipher.doFinal(content.toByteArray())
val encryptedData = Base64.encodeToString(encryptedBytes, Base64.DEFAULT)
return ENCRYPT_MARK + encryptedData
}
fun decryptMessage(content: String): String {
val cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING")
cipher.init(Cipher.DECRYPT_MODE, privateKey)
var encryptedData = Base64.decode(content.substring(ENCRYPT_MARK.length), Base64.DEFAULT)
val decryptedBytes = cipher.doFinal(encryptedData)
return String(decryptedBytes)
}
我不是很擅长加密和解密。 我尝试了几个我找到的库和代码,但没有一个对我有用。
我需要解密的示例字符串:
"p+KuB7UVUteY8g3HVMxo+7h2xhZQxhPjPayMolqq8EYyIknbQjgqHjC95NR8/le6G0F8SQACrOdj\nTlPU1+o7bZrE8ukI7B35i9sWZns3Y2scA9U7yz8z5KsTZ240+4+Xd7dZwfQ49Z6J7nNOfBR/97pq\n2l1QKe0/SThUEraZyts=\n"
我的私钥:
"-----BEGIN RSA PRIVATE KEY-----\nMIICXQIBAAKBgQDjOUZOZgIYWDMkyhyNb/gsFUDbDB3a+FWwT0d2HE7cd3bqebYLg\nKAMqwpc8nCHR77kO23Nd/U5WKVWwFcHUQVtkMcX4QNDtxSV72LRNaSaQZkwBofw9O\nu338mm1hR0DEYzYPXKuyaP3l5/pvZyvOHrA+i0ZD7pUohEtiDsuNhZbwIDAQABAoG\nBAJoM6q2cWy9GHOaEYHdDwm2guyfHPzaFxxKRrVFWP+EY3XZ6rgF+YwQzsgLyG3ic\nG7+AyyDSg18tymrWXCqJs7Mdrxq3xZmdCzwTcfgxZcwiFG0caK/jbA8rXO60xecag\nZRR+AyWa+2wnwt5xPtFcqk7GhqkWIolzQddW7L3CIuBAkEA9Xw+fnLrbR3WaxTpa3\n88NEEgvyxIS2eGc+lRUbC8w2xX5qDtV8Ak7rxkmXGURJ6tvwyUi/Q+5y+X20mBtt8\nsKwJBAOz0yph9n4iHtC+BL5U+LfpZuUO6uUctbmfXs+fU2glI8rAwXhanBCs0Ph/0\nG7aXmNKHvcSjQ9N5mhTPBvhpcc0CQH4PPTBF5ytzZQY8CNmQzuOuhhhlrwI5uUuQh\npfCgEyCOGlQPlEPdGe8CpTZRGAwc9xlo2pzFFI3mG2dQ6Ua2V0CQQCSMY11e7wbzi\n37SScEWzKezRCimueI5JzDcK/MjuRe6iThU1YZf73wsfDKYh9fDjT5X0pTsa89ID9\nSK1DPnq7ZAkB6ybvpomovyBBgSjjTEwwSHyAIr5HIE2hkDjer6/87/WNKEw1yg11b\ngSoJC67f1xnLj7bv9/EJRPWTokCaRRm/\n-----END RSA PRIVATE KEY-----"
1. SecKeyCreateDecryptedData
let encryptedMessageData = encryptedMessage.data(using: .utf8)
if let decryptedMessage:Data = SecKeyCreateDecryptedData(privateSecKey!, .rsaEncryptionPKCS1, encryptedMessageData as CFData, error) as Data? {
print("We have an decrypted message \(String.init(data: decryptedMessage, encoding: .utf8)!)")
} else {
print("Error decrypting")
}
- 不工作。我得到打印“错误解密”但变量中没有错误
2。 SwiftyRSA
let encrypted = try EncryptedMessage(data: key.data(using: .utf8)!) // try EncryptedMessage(base64Encoded: key)
let privateKey = try PrivateKey(pemEncoded: keyPair.privateKey)
let decryptedKey = try encrypted.decrypted(with: privateKey, padding: SecPadding.PKCS1)
- 出现 chunkDecryptFailed(index: 0) 错误。
3. CryptorRSA
let data = base64.data(using: .utf8)!
let encryptedData = try CryptorRSA.createEncrypted(with: data)
let decryptedData = try encryptedData.decrypted(with: privateKey, algorithm: .sha1)
-
出现错误:
Error Domain=NSOSStatusErrorDomain Code=-50 "RSAdecrypt 错误输入 (err -27)" UserInfo={numberOfErrorsDeep=0, NSDescription=RSAdecrypt 错误输入 (err -27)}
我什至尝试用这些代码行来实现解密,但没有运气:
static func decrypt(string: String, privateKey: String?) -> String? {
guard let privateKey = privateKey else { return nil }
let keyString = privateKey.replacingOccurrences(of: "-----BEGIN RSA PRIVATE KEY-----\n", with: "").replacingOccurrences(of: "\n-----END RSA PRIVATE KEY-----", with: "")
guard let data = Data(base64Encoded: keyString, options: .ignoreUnknownCharacters) else { return nil }
var attributes: CFDictionary {
return [kSecAttrKeyType : kSecAttrKeyTypeRSA,
kSecAttrKeyClass : kSecAttrKeyClassPrivate,
kSecAttrKeySizeInBits : 2048,
kSecReturnPersistentRef : true] as CFDictionary
}
var error: Unmanaged<CFError>? = nil
guard let secKey = SecKeyCreateWithData(data as CFData, attributes, &error) else {
print(error.debugDescription)
return nil
}
return decrypt(string: string, privateKey: secKey)
}
static func decrypt(string: String, privateKey: SecKey) -> String? {
let buffer = [UInt8](string.utf8)
let keySize = SecKeyGetBlockSize(privateKey)
var messageDecrypted = [UInt8](repeating: 0, count: keySize)
var messageDecryptedSize = keySize
var status = SecKeyDecrypt(privateKey, SecPadding.PKCS1, buffer, buffer.count, &messageDecrypted, &messageDecryptedSize)
if status != noErr {
print("Decryption Error!")
return nil
}
let result = String(bytes: messageDecrypted, encoding: .utf8)
print(result)
return result
}
我做错了什么?如何解密该示例数据?感谢您的帮助
【问题讨论】:
-
你有解决办法吗?
标签: ios swift encryption cryptography rsa