gpt4 book ai didi

c# - C#中的AES CTR解密

转载 作者:行者123 更新时间:2023-11-30 23:04:41 27 4
gpt4 key购买 nike

我的任务是用 C# 解密一些最初使用 PHP 加密的数据。下面是PHP代码

$opts = OPENSSL_RAW_DATA;
$res = openssl_decrypt($raw, 'aes-256-ctr', $keyhash, $opts, base64_decode($iv));

$raw是字节数组,长度为312,$keyhash为32字节,$iv为16字节。

我的问题是,当我在 C# 中复制此代码时,我收到以下 CryptographicException -输入的数据不是一个完整的 block 。

我不是一个加密专家,我已经尝试了很多很多 C# 示例来尝试让它工作,但几乎总是以同样的错误告终。这是我尝试过的 C# 代码示例之一。

static string DecryptStringFromBytes_Aes(byte[] cipherText, byte[] Key, byte[] IV)
{
// Check arguments.
if (cipherText == null || cipherText.Length <= 0)
throw new ArgumentNullException("cipherText");
if (Key == null || Key.Length <= 0)
throw new ArgumentNullException("Key");
if (IV == null || IV.Length <= 0)
throw new ArgumentNullException("IV");

// Declare the string used to hold
// the decrypted text.
string plaintext = null;

// Create an AesManaged object
// with the specified key and IV.
using (AesManaged aesAlg = new AesManaged())
{
aesAlg.Key = Key;
aesAlg.IV = IV;
aesAlg.Padding = PaddingMode.PKCS7;

// Create a decrytor to perform the stream transform.
ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);

// Create the streams used for decryption.
using (MemoryStream msDecrypt = new MemoryStream(cipherText))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{

// Read the decrypted bytes from the decrypting stream
// and place them in a string.
plaintext = srDecrypt.ReadToEnd();
}
}
}

}

return plaintext;

}

我已经用 PHP 实现了代码,并且运行良好。我还检查了所有输入字节数组,它们对于 PHP 和 C# 都完全相同。无奈之下,我什至用 Java 实现了它,而且它再次没有问题。

        SecretKeySpec keySpec = new SecretKeySpec(keyHash, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(iv);

Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5PADDING");


cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
byte [] original = cipher.doFinal(encData);
String plaintext = new String(original);

那么 C# 代码怎么了,我怎样才能让它工作?

提前致谢。

最佳答案

好的。这是一个已经回答过的重复问题。我只是错过了简单的答案,它在这里 - Aes128CounterMode.cs .并且此代码将生成正确的结果 -

byte[] plainText = new byte[encData.Length];
Aes128CounterMode am = new Aes128CounterMode(iv);
ICryptoTransform ict = am.CreateEncryptor(keyHash, null);
ict.TransformBlock(encData, 0, encData.Length, plainText, 0);
return Encoding.UTF8.GetString(plainText);

关于c# - C#中的AES CTR解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49235160/

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