【发布时间】:2014-01-31 09:38:00
【问题描述】:
我有问题。我有一种在 php 和 C# 中加密密码的方法,但我无法使用两种算法获得相同的结果。有人可以帮助我吗?
PhP
<?php
$password = 'MySecretPass';
$secret = '65rgt85k89xrDAr3';
$iv = 'AAAAAAAAAAAAAAAA';
$td = mcrypt_module_open('rijndael-128', '', 'cfb','');
mcrypt_generic_init($td, $secret, $iv);
$password = mcrypt_generic($td, $password);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$password=base64_encode($password);
echo $password;
?>
C#
var password = padString("MySecretPass");
txtEncrypt.Text = Convert.ToBase64String(EncryptStringToBytes(password,
Encoding.UTF8.GetBytes("65rgt85k89xrDAr3"),
Encoding.UTF8.GetBytes("AAAAAAAAAAAAAAAA"), PaddingMode.None));
txtEncrypt.Text = txtEncrypt.Text;
static byte[] EncryptStringToBytes(string plainText, byte[] key, byte[] iv, PaddingMode mode)
{
byte[] encrypted;
using (var rijAlg = new RijndaelManaged { Mode = CipherMode.CFB, BlockSize = 128, Padding = mode })
{
rijAlg.Key = key;
rijAlg.IV = iv;
var encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV);
using (var msEncrypt = new MemoryStream())
{
using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (var swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(plainText);
}
encrypted = msEncrypt.ToArray();
}
}
}
return encrypted;
}
private static String padString(String source)
{
char paddingChar = ' ';
int size = 16;
int x = source.Length % size;
int padLength = size - x;
for (int i = 0; i < padLength; i++)
{
source += paddingChar;
}
return source;
}
PhP 的结果是“/KNlzi/fZOERWL79”,但 c# 的结果是 /J643dvAR4/Gh0aYHdshNw==。我不知道为什么我的结果不同。此外,我用 Java 编写了代码,得到的结果与用 C# 相同。
提前致谢。
【问题讨论】:
-
您刚刚与全世界分享了您的秘密密钥吗?
-
是一个随机词。不是真正的密钥。
-
你也可以用CBC快速测试; CBC比CFB具有更少的特性,所以如果使用CBC的密文相同,那么区别在于CFB参数。
-
我已更改为 CBC,我在 php 和 .net 中得到不同的结果 rfgcnO3PPP1uXzBXKvIYiQ== 和 chlsxEsrCQEQUWXVPZvGA==
-
.NET 版本不是 4 个字符的倍数。请检查并重新发布。
标签: c# php cryptography rijndael