我正在构建一个使用 c# 网络服务的 iPhone 应用程序。我的 iPhone 应用程序接收一些数据并对其进行加密并将其传递给网络服务。如何在 C# 中解密数据?
我的 iPhone 应用程序包含以下代码:
NSString *pString = @"Some string to be encoded";
NSString *key = @"My encryption key";
NSData *pData = [pString dataUsingEncoding:NSUTF8StringEncoding];
pData = [pData AES256EncryptWithKey:key];
NSString *pID = [pData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
编辑:数据已经存储在网络服务中,所以我不能轻易改变加密方法。 C# 应用程序不在服务器上,因此不可能泄露 key 。
我尝试了以下 C# 代码来解密数据:
static string DecryptString(string encryptedText, string key)
{
byte[] encryptedString = Convert.FromBase64String(encryptedText);
byte[] encryptionKey = Encoding.UTF8.GetBytes(key.Substring(0, 32));
using (var provider = new AesCryptoServiceProvider())
{
provider.Mode = CipherMode.CBC;
provider.Padding = PaddingMode.PKCS7;
provider.Key = encryptionKey;
using (var ms = new MemoryStream(encryptedString))
{
// Read the first 16 bytes which is the IV.
byte[] iv = new byte[16];
ms.Read(iv, 0, 16);
provider.IV = iv;
using (var decryptor = provider.CreateDecryptor())
{
using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
{
using (var sr = new StreamReader(cs))
{
return sr.ReadToEnd();
}
}
}
}
}
}
但是,我得到以下异常:
System.Security.Cryptography.CryptographicException was unhandled
HResult=-2146233296 Message=Padding is invalid and cannot be
removed.
DecryptString接收到的加密文本长度为80字节。
Best Answer-推荐答案 strong>
示例 ObjC 代码默认使用 CBC 调制解调器、PKCS#7 填充和 16 个 0x00 字节的默认 iv。
C# 还使用 CBC 模式和 PKCS#7 填充。解密代码需要一个 16 字节的 iv 预先附加到加密数据,但它不存在。
byte[] iv = new byte[16];
ms.Read(iv, 0, 16);
provider.IV = iv;
这需要更改,以便 iv 设置为 16 个 0x00 字节的数组,并且 ms.Read(iv, 0, 16) 语句需要删除,以便解密函数获得所有加密数据。
注意事项:
在加密中使用 default 任何东西都是一个坏主意,始终提供正确长度的数据。
需要增加对加密数据的鉴权,以判断 key 是否错误或数据是否被篡改。
确实应该使用一个版本号和一个随机 IV,并将其添加到加密的前面,因此您真的应该考虑更正它。这说明了为什么通常需要提供和使用版本号。
RNCryptor 涵盖了上述问题。
还需要考虑加密 key 的处理,以便尽可能安全。
关于c# - Objective-C 中的字符串加密在 C# 中解密,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/34259933/
|