在C#和PHP中,TripleDES加密没有得到相同的结果

布普林德·辛格(Bhupinder Singh)

C#返回以下base64编码的字符串:

joxzS5XnP63ymrhy6t4ogWK9TxwfwD83

下面是C#中的代码

我们

ing System.IO;
using System;
using System.Text;
using System.Security.Cryptography;

class Program
{
    static void Main()
    {
        // Read in every line in the file.
        using (StreamReader reader = new StreamReader("input.txt"))
        {
            string abc = "string to encrypt";
            Program p = new Program();
            string value =    p.Encrypt(abc, true);
            Console.Write(value);
        }
    }

    public string Encrypt(string toEncrypt, bool useHashing)
        {
            byte[] keyArray;
            byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);

            //System.Configuration.AppSettingsReader settingsReader = new AppSettingsReader();
            // Get the key from config file
            string key = "encrypt key";
            //System.Windows.Forms.MessageBox.Show(key);
            if (useHashing)
            {
                MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
                keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
                hashmd5.Clear();
            }
            else
                keyArray = UTF8Encoding.UTF8.GetBytes(key);

            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
            tdes.Key = keyArray;
            tdes.Mode = CipherMode.ECB;
            tdes.Padding = PaddingMode.PKCS7;

            ICryptoTransform cTransform = tdes.CreateEncryptor();
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
            tdes.Clear();
            return Convert.ToBase64String(resultArray, 0, resultArray.Length);
        }


}

我在PHP中使用MCrypt库,该库返回

ThPKJ1BPJLeUwJtIT/zAs3ocZ2s6SU+M

PHP代码:

$str = "string to encrypt";

$input = utf8_encode($str);
$key = "encrypt key";
echo apiEncode($input, $key);


function apiEncode($data, $secret)
{    
  //Generate a key from a hash
  $key = md5(utf8_encode($secret), true);
  //Create init vector  
  $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_ecb), MCRYPT_RAND); 

  //Pad for PKCS7
  $blockSize = mcrypt_get_block_size('tripledes', 'ecb');
  $len = strlen($data);
  $pad = $blockSize - ($len % $blockSize);
  $data .= str_repeat(chr($pad), $pad);

  //Encrypt data
  $encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb'); //, $iv);
  return base64_encode($encData);
}

除了上述之外,我还尝试了其他各种解决方案,因此

三重加密在PHP和C#中不会产生相同的结果

C#和PHP中的TripleDES加密不一样(PKCS7,ECB)吗?

布普林德·辛格(Bhupinder Singh)

考虑到DES和TripleDES的安全漏洞,双方均实施了AES / RIJNDAEL_256算法。

C#

    public String DecryptRJ256(string cypher, string KeyString, string IVString)
    {
        string sRet = string.Empty;
        RijndaelManaged rj = new RijndaelManaged();
        UTF8Encoding encoding = new UTF8Encoding();

        byte[] decbuff = Convert.FromBase64String(cypher);

        try
        {
            byte[] Key = encoding.GetBytes(KeyString);
            byte[] IV = encoding.GetBytes(IVString);

            rj.Padding = PaddingMode.PKCS7;
            rj.Mode = CipherMode.CBC;
            rj.KeySize = 256;
            rj.BlockSize = 256;
            rj.Key = Key;
            rj.IV = IV;
            MemoryStream ms = new MemoryStream(decbuff);

            using (CryptoStream cs = new CryptoStream(ms, rj.CreateDecryptor(Key, IV), CryptoStreamMode.Read))
            {
                using (StreamReader sr = new StreamReader(cs))
                {
                    sRet = sr.ReadToEnd();
                }
            }
        }
        finally
        {
            rj.Clear();
        }
        return sRet;
    }

public string Encrypt(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.BlockSize = 256;
        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

public function apiEncode($text, $key, $iv)
{
    // to append string with trailing characters as for PKCS7 padding scheme
    $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
    $padding = $block - (strlen($text) % $block);
    $text .= str_repeat(chr($padding), $padding);

    $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CBC, $iv);
    return base64_encode($crypttext);
}

publc function apiDecode($text, $key, $iv){

    $text = base64_decode($text);
    $crypttext = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CBC, $iv);
    return $crypttext;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用TripleDES加密在Node.js和PHP-mcrypt中获得相同的结果?

来自分类Dev

如何使用TripleDES加密在Node.js和PHP-mcrypt中获得相同的结果?

来自分类Dev

cout.setf(ios :: fixed)和cout <<已修复似乎没有得到相同的结果?

来自分类Dev

为什么我没有得到相同的结果?

来自分类Dev

MYSQL - In select 与 In with numbers 没有得到相同的结果

来自分类Dev

如何在C#中从1:30 am减去11:00 pm而没有得到9:30结果

来自分类Dev

如何在C#中从1:30 am减去11:00 pm而没有得到9:30结果

来自分类Dev

在python中追加列表,但没有得到结果

来自分类Dev

在 Django 搜索中没有得到结果

来自分类Dev

使用 C++ 中的增量运算符没有得到正确的结果

来自分类Dev

OpenSSL中的TripleDES加密和使用C#解密

来自分类Dev

OpenSSL中的TripleDES加密和使用C#解密

来自分类Dev

GridBagLayout没有得到预期的结果

来自分类Dev

Ruby代码没有得到结果

来自分类Dev

pytesseract没有得到正确的结果

来自分类Dev

我没有得到想要的结果

来自分类Dev

setMinutes没有得到预期的结果

来自分类Dev

LongAccumulator 没有得到正确的结果

来自分类Dev

没有得到任何结果

来自分类Dev

Nodejs APi没有得到结果

来自分类Dev

在CURL Soap PHP中没有得到正确的响应

来自分类Dev

在C中没有得到NULL指针错误

来自分类Dev

Google Currency Converter已更改其URL,但没有得到相同的结果

来自分类Dev

为什么每次运行循环时都没有得到相同的结果?

来自分类Dev

PHP / AJAX 没有得到回报

来自分类Dev

在C#和PHP中,AES加密的结果不同

来自分类Dev

PHP中的C#TripleDES ECB加密

来自分类Dev

Sequelize中的findAll()没有得到

来自分类Dev

在使用游标插入之前和之后没有得到相同的ListView项

Related 相关文章

  1. 1

    如何使用TripleDES加密在Node.js和PHP-mcrypt中获得相同的结果?

  2. 2

    如何使用TripleDES加密在Node.js和PHP-mcrypt中获得相同的结果?

  3. 3

    cout.setf(ios :: fixed)和cout <<已修复似乎没有得到相同的结果?

  4. 4

    为什么我没有得到相同的结果?

  5. 5

    MYSQL - In select 与 In with numbers 没有得到相同的结果

  6. 6

    如何在C#中从1:30 am减去11:00 pm而没有得到9:30结果

  7. 7

    如何在C#中从1:30 am减去11:00 pm而没有得到9:30结果

  8. 8

    在python中追加列表,但没有得到结果

  9. 9

    在 Django 搜索中没有得到结果

  10. 10

    使用 C++ 中的增量运算符没有得到正确的结果

  11. 11

    OpenSSL中的TripleDES加密和使用C#解密

  12. 12

    OpenSSL中的TripleDES加密和使用C#解密

  13. 13

    GridBagLayout没有得到预期的结果

  14. 14

    Ruby代码没有得到结果

  15. 15

    pytesseract没有得到正确的结果

  16. 16

    我没有得到想要的结果

  17. 17

    setMinutes没有得到预期的结果

  18. 18

    LongAccumulator 没有得到正确的结果

  19. 19

    没有得到任何结果

  20. 20

    Nodejs APi没有得到结果

  21. 21

    在CURL Soap PHP中没有得到正确的响应

  22. 22

    在C中没有得到NULL指针错误

  23. 23

    Google Currency Converter已更改其URL,但没有得到相同的结果

  24. 24

    为什么每次运行循环时都没有得到相同的结果?

  25. 25

    PHP / AJAX 没有得到回报

  26. 26

    在C#和PHP中,AES加密的结果不同

  27. 27

    PHP中的C#TripleDES ECB加密

  28. 28

    Sequelize中的findAll()没有得到

  29. 29

    在使用游标插入之前和之后没有得到相同的ListView项

热门标签

归档