C# 和 Swift 中的 RNCryptor,RNCryptorError 错误 2

Posted

技术标签:

【中文标题】C# 和 Swift 中的 RNCryptor,RNCryptorError 错误 2【英文标题】:RNCryptor in C# and Swift, RNCryptorError error 2 【发布时间】:2016-03-19 09:01:26 【问题描述】:

我在 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 Decryptor 函数时,它返回了:

RNCryptorError 错误 2.

例如: qrCodeString = "ABC"。 公共静态字符串 EncryptQRCode 返回 =

"AgF6P5Ya0SifSymd3LqKdH+kGMCFobiziUhwwB6/lfZgAA9N+F5h350MyigoKo9qgUpMXX3x9FxZXwUOJODL4is3R62EGvZWdJBzjSNCef7Ouw=="

“msg”是从 EncryptQRCode(Base64 编码字符串)返回的数据。

pwd = "密码"

的编码数据=

decryptedString 和decryptedData 由于发生错误而没有值。

【问题讨论】:

你做了什么调试?在加密和解密之前和之后转储数据和密码。比较以确定问题所在。将其添加到问题中。 谢谢,我编辑了这个问题。 @zaph C# 的 Base64Encoding 算法是否可能与 Swift 中的 Base64Encoding 不同? @zaph 检查Base64 documentation,标准编码由字符“a-zA-Z0-9+/=”组成。 我想知道qrEncryptor.Encrypt (qrCodeString, "password");msg返回的确切内容,发送到Decrypt(msg:StringencodedData(十六进制)和pwdtext(十六进制)和k .换句话说,每个阶段的数据。还要升级变量名称,如果它们是描述性的,它会有所帮助,k 不是。 【参考方案1】:

RNCryptorError 错误 2

UnknownHeader = 2 无法识别的数据格式。通常这意味着数据已损坏。

这意味着传递的数据格式不正确。

我得到的最好的编程建议是有一天晚上在机房里向 Rick Cullman 寻求帮助,他说:“阅读文档。”

这就是为什么我建议显示输入和输出,你会明白的。

有很多地方需要十六进制来查看正在发生的事情并进行调试。

在 RNCryptor Swift 中打开 issue 以将错误代码添加到文档中。

【讨论】:

非常感谢您对我的帮助。如您所知,“-initWithBase64EncodedString:options:”在 Obj C 中。在 Swift 中是: "NSData(base64EncodedString: source, options: NSDataBase64DecodingOptions(rawValue: 0))" 。我为“func Decrypt”编写的代码相同。它返回给我一个 NSData 对象,该对象使用给定的 Base64 编码字符串进行初始化。而且,当我在 Swift 中尝试我的加密和解密函数时,它工作正常。但是对于来自另一种语言的 Base64 编码字符串,它会返回错误。再次感谢您对我的帮助! @zaph【参考方案2】:

在C#中,当你想加密文本时,你必须使用Schema.V3进行加密。 Swift 中的解密器无法识别 Base 64 编码字符串的 Schema 版本。

string encrypted = encryptor.Encrypt (YOUR_PLAIN_TEXT, YOUR_PASSWORD,Schema.V3);

【讨论】:

以上是关于C# 和 Swift 中的 RNCryptor,RNCryptorError 错误 2的主要内容,如果未能解决你的问题,请参考以下文章

解码 base64 + 解密 - Swift

Swift 中的 C# 异步等待

为啥 Swift 不像 Java 或 C# 那样对属性使用 getter 和 setter?

swift中的任何功能是不是类似于Android中的R.java?

忽略 R.Swift 中的 segue 资源

无法加密和解密 plist 中的数据