【问题标题】:rijndael 128 cfb C# and phprijndael 128 cfb C# 和 php
【发布时间】: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


【解决方案1】:

这可能是Encoding.GetBytes(string) 返回“Unicode 编码”。这是一种实际上不存在的编码,但它返回 UTF-16。另一方面,您将密钥和 IV 视为 ASCII 字符。

所以无论PHP当时使用哪种编码,都会出现不匹配的情况。您应该明确定义在将文本字符串转换为字节时应该使用哪种编码,无论是在 PHP 代码中还是在 C# 代码中。

【讨论】:

  • 我使用了相同的编码(Utf-8 和 ASCII),但两者之间仍然存在差异
  • 你现在至少得到相同大小的密文了吗?您能否发布更新的结果和您所做的更改(在原始问题下方?)
猜你喜欢
  • 1970-01-01
  • 2014-12-10
  • 2021-12-20
  • 1970-01-01
  • 2019-04-18
  • 2019-02-15
  • 2017-12-26
  • 1970-01-01
  • 2014-12-10
相关资源
最近更新 更多