C#中的RNCryptor和Swift,RNCryptorError错误2
RNCryptor in C# and Swift, RNCryptorError error 2
我在 Swift 和 C#.NET 中使用 RNCryptor。我需要跨平台 AES 加密,因此,我使用的是 RNCryptor。
当我在 Swift 中加密一些明文时,我可以在 Swift 中正确解密它而不会出现任何错误。但是当我在 C# 中加密一些文本然后我想在 Swift 中解密它时,我得到一个错误“操作无法完成。(RNCryptorError 错误 2.)”
我的 C# 代码:
public static string EncryptQRCode(string qrCodeString){
var qrEncryptor = new Encryptor ();
return qrEncryptor.Encrypt (qrCodeString, "password");
}
public static string DecryptQRCode(string qrEncryptedString){
var qrDecryptor = new Decryptor();
return qrDecryptor.Decrypt (qrEncryptedString, "password");
}
我在 Swift 中的代码:
func Encrypt(msg:String, pwd:String) -> String{
let data = msg.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
let chiper = RNCryptor.encryptData(data!, password: pwd)
let base = chiper.base64EncodedDataWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
let stringBase = String(data: base, encoding: NSUTF8StringEncoding)
return stringBase!
}
func Decrypt(msg:String, pwd:String) -> String{
let encodedData:NSData = NSData(base64EncodedString: msg, options: NSDataBase64DecodingOptions(rawValue: 0))!
do{
let decryptedData = try RNCryptor.decryptData(encodedData, password: pwd)
let decrypytedString = String(data: text, encoding: NSUTF8StringEncoding)
return decryptedString!
}
catch let error as NSError{
print(error.localizedDescription)
print(error.localizedDescription)
}
return "AN ERROR OCCURED"
}
例如:
“ABC”,C# 密码为“behdad”,加密器返回:
"AgHfT2VvVOorlux0Ms47K46fG5lQOP2YhYWq2KeIKh+MisCDqZfrLF+KsJyBR2EBNC3wQpaKev0X4+9uuC5vliVoHkLsEi6ZI7ZIZ8qVUEkYGQ=="
当我用 C# 解密时,它返回“ABC”。
但是当我将这个 Base64Encoded 字符串传递给我的 Swift 解密函数时,它返回:
RNCryptorError error 2.
例如:
qrCodeString = "ABC"。
public 静态字符串 EncryptQRCode returns =
"AgF6P5Ya0SifSymd3LqKdH+kGMCFobiziUhwwB6/lfZgAA9N+F5h350MyigoKo9qgUpMXX3x9FxZXwUOJODL4is3R62EGvZWdJBzjSNCef7Ouw=="
"msg"是EncryptQRCode(The Base64 Encoded String)返回的数据。
pwd = "password"
encoded data = <02017a3f 961ad128 9f4b299d dcba8a74 7fa418c0 85a1b8b3 894870c0 1ebf95f6 60000f4d f85e61df 9d0cca28 282a8f6a 814a4c5d 7df1f45c 595f050e 24e0cbe2 2b3747ad 841af656 7490738d 234279fe cebb>
由于发生错误,decryptedString 和 decryptedData 没有值。
RNCryptorError 错误2
UnknownHeader = 2
Unrecognized data format. Usually this means the data is corrupt.
这意味着传递的数据格式不正确。
我得到的最好的编程建议是在计算机房的一个晚上,当时我向 Rick Cullman 寻求帮助,他说:"Read the documentation."
这就是我建议显示输入和输出的原因,您会明白的。
有很多地方需要十六进制来查看发生了什么并进行调试。
在 RNCryptor Swift 中打开了一个 issue 以将错误代码添加到文档中。
在C#中,如果要对文本进行加密,则必须使用Schema.V3进行加密。 Swift 中的解密器无法识别 Base 64 编码字符串的架构版本。
string encrypted = encryptor.Encrypt (YOUR_PLAIN_TEXT, YOUR_PASSWORD,Schema.V3);
我在 Swift 和 C#.NET 中使用 RNCryptor。我需要跨平台 AES 加密,因此,我使用的是 RNCryptor。 当我在 Swift 中加密一些明文时,我可以在 Swift 中正确解密它而不会出现任何错误。但是当我在 C# 中加密一些文本然后我想在 Swift 中解密它时,我得到一个错误“操作无法完成。(RNCryptorError 错误 2.)”
我的 C# 代码:
public static string EncryptQRCode(string qrCodeString){
var qrEncryptor = new Encryptor ();
return qrEncryptor.Encrypt (qrCodeString, "password");
}
public static string DecryptQRCode(string qrEncryptedString){
var qrDecryptor = new Decryptor();
return qrDecryptor.Decrypt (qrEncryptedString, "password");
}
我在 Swift 中的代码:
func Encrypt(msg:String, pwd:String) -> String{
let data = msg.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
let chiper = RNCryptor.encryptData(data!, password: pwd)
let base = chiper.base64EncodedDataWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
let stringBase = String(data: base, encoding: NSUTF8StringEncoding)
return stringBase!
}
func Decrypt(msg:String, pwd:String) -> String{
let encodedData:NSData = NSData(base64EncodedString: msg, options: NSDataBase64DecodingOptions(rawValue: 0))!
do{
let decryptedData = try RNCryptor.decryptData(encodedData, password: pwd)
let decrypytedString = String(data: text, encoding: NSUTF8StringEncoding)
return decryptedString!
}
catch let error as NSError{
print(error.localizedDescription)
print(error.localizedDescription)
}
return "AN ERROR OCCURED"
}
例如:
“ABC”,C# 密码为“behdad”,加密器返回:
"AgHfT2VvVOorlux0Ms47K46fG5lQOP2YhYWq2KeIKh+MisCDqZfrLF+KsJyBR2EBNC3wQpaKev0X4+9uuC5vliVoHkLsEi6ZI7ZIZ8qVUEkYGQ=="
当我用 C# 解密时,它返回“ABC”。
但是当我将这个 Base64Encoded 字符串传递给我的 Swift 解密函数时,它返回:
RNCryptorError error 2.
例如: qrCodeString = "ABC"。 public 静态字符串 EncryptQRCode returns =
"AgF6P5Ya0SifSymd3LqKdH+kGMCFobiziUhwwB6/lfZgAA9N+F5h350MyigoKo9qgUpMXX3x9FxZXwUOJODL4is3R62EGvZWdJBzjSNCef7Ouw=="
"msg"是EncryptQRCode(The Base64 Encoded String)返回的数据。
pwd = "password"
encoded data = <02017a3f 961ad128 9f4b299d dcba8a74 7fa418c0 85a1b8b3 894870c0 1ebf95f6 60000f4d f85e61df 9d0cca28 282a8f6a 814a4c5d 7df1f45c 595f050e 24e0cbe2 2b3747ad 841af656 7490738d 234279fe cebb>
由于发生错误,decryptedString 和 decryptedData 没有值。
RNCryptorError 错误2
UnknownHeader = 2
Unrecognized data format. Usually this means the data is corrupt.
这意味着传递的数据格式不正确。
我得到的最好的编程建议是在计算机房的一个晚上,当时我向 Rick Cullman 寻求帮助,他说:"Read the documentation."
这就是我建议显示输入和输出的原因,您会明白的。
有很多地方需要十六进制来查看发生了什么并进行调试。
在 RNCryptor Swift 中打开了一个 issue 以将错误代码添加到文档中。
在C#中,如果要对文本进行加密,则必须使用Schema.V3进行加密。 Swift 中的解密器无法识别 Base 64 编码字符串的架构版本。
string encrypted = encryptor.Encrypt (YOUR_PLAIN_TEXT, YOUR_PASSWORD,Schema.V3);