gpt4 book ai didi

c# - Rijndael 256 在 c# 和 php 之间加密/解密?

转载 作者:可可西里 更新时间:2023-11-01 12:17:37 27 4
gpt4 key购买 nike

已更新

我已经对 C# 代码进行了更改,因此它使用的 block 大小为 256。但是现在 Hello World 看起来像这样的 http://pastebin.com/5sXhMV11,我无法弄清楚我应该使用 rtrim() 来摆脱困惑结束。

此外,当您说 IV 应该是随机的时,您的意思是不要多次使用相同的 IV,还是我的编码方式有误?

再次感谢!

你好,

我正在尝试使用 PHP 解密在 C# 中加密的字符串。我似乎无法让 PHP 使用 mcrypt 对其进行解密,请提供一些帮助。我在使用 php 时遇到以下错误,所以我猜我没有正确设置 IV。

错误:IV 参数必须与 block 大小一样长

这两个函数使用相同的密码、 key 、IV 并设置为 CBC 模式:

来自 c# 的加密文本 = UmzUCnAzThH0nMkIuMisqg==
键 32 长 = qwertyuiopasdfghjklzxcvbnmqwerty
iv 16 长 = 1234567890123456

C#

    public static string EncryptString(string message, string KeyString, string IVString)
{
byte[] Key = ASCIIEncoding.UTF8.GetBytes(KeyString);
byte[] IV = ASCIIEncoding.UTF8.GetBytes(IVString);

string encrypted = null;
RijndaelManaged rj = new RijndaelManaged();
rj.Key = Key;
rj.IV = IV;
rj.Mode = CipherMode.CBC;

try
{
MemoryStream ms = new MemoryStream();

using (CryptoStream cs = new CryptoStream(ms, rj.CreateEncryptor(Key, IV), CryptoStreamMode.Write))
{
using (StreamWriter sw = new StreamWriter(cs))
{
sw.Write(message);
sw.Close();
}
cs.Close();
}
byte[] encoded = ms.ToArray();
encrypted = Convert.ToBase64String(encoded);

ms.Close();
}
catch (CryptographicException e)
{
Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
return null;
}
catch (UnauthorizedAccessException e)
{
Console.WriteLine("A file error occurred: {0}", e.Message);
return null;
}
catch (Exception e)
{
Console.WriteLine("An error occurred: {0}", e.Message);
}
finally
{
rj.Clear();
}

return encrypted;
}

PHP

var $mcrypt_cipher = MCRYPT_RIJNDAEL_256;
var $mcrypt_mode = MCRYPT_MODE_CBC;

function decrypt($key, $iv, $encrypted)
{
$encrypted = base64_decode($encrypted);

$decrypted = rtrim(mcrypt_decrypt($this->mcrypt_cipher, $key, $encrypted, $this->mcrypt_mode, $iv), "\0");;
return $decrypted;
}

谢谢

最佳答案

如果您想在 C# 应用程序中使用 Rijndael256,则必须将 BlockSize 设置为 256。

RijndaelManaged rj = new RijndaelManaged();
rj.BlockSize = 256;

然后你的 iv 也必须是 256 位长。
SymmetricAlgorithm.BlockSize Property


或者反过来:目前您的 C# 应用程序使用 Rijndael128,因此您的 php 脚本也必须使用。

<?php
class Foo {
protected $mcrypt_cipher = MCRYPT_RIJNDAEL_128;
protected $mcrypt_mode = MCRYPT_MODE_CBC;

public function decrypt($key, $iv, $encrypted)
{
$iv_utf = mb_convert_encoding($iv, 'UTF-8');
return mcrypt_decrypt($this->mcrypt_cipher, $key, base64_decode($encrypted), $this->mcrypt_mode, $iv_utf);
}
}



$encrypted = "UmzUCnAzThH0nMkIuMisqg==";
$key = "qwertyuiopasdfghjklzxcvbnmqwerty";
$iv = "1234567890123456";

$foo = new Foo;
echo $foo->decrypt($key, $iv, $encrypted);

打印hello world

关于c# - Rijndael 256 在 c# 和 php 之间加密/解密?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3431950/

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