【发布时间】:2016-03-19 12:21:06
【问题描述】:
我正在构建一个使用 c# 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];
编辑:数据已经存储在网络服务中,所以我不能轻易更改加密方法。 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 Message=填充无效且不能 删除。
DecryptString 接收到的 encryptedText 长度为 80 字节。
【问题讨论】:
-
@JSWilson 有几个问题: 1. AES 的密钥大小为 128 位、192 位和 256 位,但没有 64 字节(512 位)。 2. iv 通常是块大小的随机数据(AES 为 128 位)并添加到加密数据之前。模式一般是CBC和填充PKCS#7。确保 key 和 iv 是所需的大小。
-
方法:
AES256EncryptWithKey是一个应用实现,您需要为其提供该代码。 -
@prince 您提供的示例在示例中内置了一个默认 IV,因此它不适用于来自 IOS 的数据。
标签: c# ios objective-c encryption