我正在构建一个使用ac#Web服务的iPhone应用程序。我的iPhone应用程序接收一些数据并将其加密,然后将其传递到Web服务。如何在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 = -2146233296消息=填充无效,无法删除。
DecryptString接收到的cryptonedText长度为80个字节。
默认情况下,示例ObjC代码使用CBC调制解调器,PKCS#7填充和160x00
字节的默认iv 。
C#还使用CBC模式和PKCS#7填充。解密代码期望在加密数据之前添加一个16字节的iv,并且该密码不存在。
byte[] iv = new byte[16];
ms.Read(iv, 0, 16);
provider.IV = iv;
需要对此进行更改,以便将iv
其设置为160x00
个字节的数组,并且ms.Read(iv, 0, 16)
需要删除该语句,以便解密函数获取所有加密数据。
笔记:
在加密中使用任何东西都是不好的主意,请始终提供正确的长度数据。
应该添加对加密数据需求的身份验证,以便可以确定是否存在错误的密钥或数据是否被篡改。
确实应该有一个版本号和一个随机IV,该IV放在加密之前,因此您应该真正考虑对此进行更正。这说明了为什么通常需要提供和使用版本号。
RNCryptor涵盖了以上问题。
还需要考虑加密密钥的处理,以确保其安全性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句