Objective-C中的字符串加密在C#中解密
本文关键字:解密 字符串 Objective-C 加密 | 更新日期: 2023-09-27 18:26:49
我正在构建一个使用c#web服务的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];
编辑:数据已经存储在web服务中,所以我无法轻易更改加密方法。C#应用程序不在服务器上,因此不可能泄露密钥。
我已经尝试了以下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未得到处理
HResult=-2146232396消息=填充无效,不能已删除。
DecryptString接收到的encryptedText的长度为80字节。
示例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)
语句需要删除,以便解密函数获得所有加密数据。
注:
在加密中使用devault任何东西都是个坏主意,总是提供正确的长度数据。
应该添加对加密数据的验证,以便确定是否存在不正确的密钥或数据已被篡改。
确实应该有一个版本号和一个随机IV,并在加密之前使用,所以你真的应该考虑纠正这一点。这说明了为什么通常需要提供和使用版本号。
RNCryptor涵盖了上述问题。
加密密钥的处理也需要考虑,以便尽可能安全。
您需要首先将base-64编码的字符串解码为字节[]-请参阅Convert.FromBase64String()。然后您需要使用Aes类对其进行解密-文档页面上有一个示例。