gpt4 book ai didi

ios - 在 iOS 上解密 AES-128 加密数据

转载 作者:行者123 更新时间:2023-11-29 10:51:40 26 4
gpt4 key购买 nike

我正在尝试解密 AES加密数据(在 .NET 中加密),但我的解密结果字符串似乎不可读,而且我没有收到任何错误。

数据使用以下方式加密:

  • 填充:PKCS7Padding
  • key 大小:128
  • 模式:CBC,

我有 InItVector、PassCode、salt 和 NumberOfPassword (3) 迭代。

这是我的代码:

//I am retrieving my encrypted data from sqlite database:
NSString *strEncryptedData = [NSString stringWithUTF8String:(char *)sqlite3_column_blob(mysqlStatement, 0)];
NSData *dataToDecrypt = [[NSData alloc] initWithBase64EncodedString:strEncryptedData options:0];

NSString *password = @"somesecurepassword";
NSData *saltData = [@"mysalt" dataUsingEncoding:NSUTF8StringEncoding];
NSData *ivData = [@"myIV16charvalue1" dataUsingEncoding:NSUTF8StringEncoding];
NSError *error;

NSData *decryptedData = [RNCryptManager decryptedDataForData:encoded password:password iv:ivData salt:saltData HMACSalt:NULL HMAC:NULL error:&error];

NSString *str = [[NSString alloc] initWithData:decryptedData encoding:NSASCIIStringEncoding];

NSLog(@"decrypted string: %@", str);

//这里是.NET端加密数据的代码:

static string hashAlgorithm = "SHA1";
static int passwordIterations = 3;
static string initVector = "myIV16charvalue1";
static int keySize = 128;
static string passPhrase = "somesecurepassword";
static string saltValue = "mysalt";

public static string EncryptData(string plainText)
{
byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);
byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);

PasswordDeriveBytes password = new PasswordDeriveBytes(
passPhrase,
saltValueBytes,
hashAlgorithm,
passwordIterations);

byte[] keyBytes = password.GetBytes(keySize / 8);

RijndaelManaged symmetricKey = new RijndaelManaged();

// It is reasonable to set encryption mode to Cipher Block Chaining
// (CBC). Use default options for other symmetric key parameters.
symmetricKey.Mode = CipherMode.CBC;
symmetricKey.BlockSize = 128;
symmetricKey.Padding = PaddingMode.PKCS7;


ICryptoTransform encryptor = symmetricKey.CreateEncryptor(
keyBytes,
initVectorBytes);
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(memoryStream,
encryptor,
CryptoStreamMode.Write);

// Start encrypting.
cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);

// Finish encrypting.
cryptoStream.FlushFinalBlock();
byte[] cipherTextBytes = memoryStream.ToArray();

memoryStream.Close();
cryptoStream.Close();

string cipherText = Convert.ToBase64String(cipherTextBytes);

return cipherText;
}

最佳答案

这里有几个错误。看起来 decryptedDataForData:...RNCryptManager 的修改版本, 但注入(inject)了几个错误。特别是,看起来作者复制了加密方法(encryptedDataForData:...),然后只是更改了操作。你不能那样做。解密方法不同于加密方法。在上面的代码中,解密器忽略传递给它的 salt 和 IV,并创建随机值(这是加密器的工作方式,而不是解密器)。

其他一些问题:

  • 在您的加密器中,您将 PBKDF2 迭代设置为 3。在解密器中,您将它们设置为 2。顺便说一句,这个值非常非常低。通常至少为 1000,更常见的是至少 10,000。

  • 您的 IV 长度错误。它必须正好是 16 个字节。理想情况下,每条消息的 IV 都应该不同,并且应该与解密器​​一起发送。如果您有静态 IV,则会降低加密的安全性。

  • 虽然不是您问题的原因,但每条消息的加盐值也应该是随机的,并随同发送到解密器。静态盐使得执行密码攻击变得更加容易。


编辑:(请注意,您仍在使用破解版本的 encryptedDataWithData: 进行解密。我建议使用上面链接的 decryptedDataWithData: 方法。您的方式已经破解了 encryptedDataWithData: 可能会起作用,但这只是因为它创建的缓冲区恰好太长了。)

更深层次的问题是您在 C# 中使用了错误的 KDF。您正在使用实现 PBKDF1 的 PasswordDeriveBytes。你应该使用 Rfc2898DeriveBytes ,它实现了 PBKDF2。

请注意,您使用的 RNCryptManager 版本中存在错误。在 AESKeyForPassword:salt: 中,这一行:

password.length,  // passwordLength

应该是:

[password lengthOfBytesUsingEncoding:UTF8StringEncoding],

关于ios - 在 iOS 上解密 AES-128 加密数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20154969/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com