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

Rijndael 256 Encrypt/decrypt between c# and php?(Rijndael 256 在 c# 和 php 之间加密/解密?)
本文介绍了Rijndael 256 在 c# 和 php 之间加密/解密?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

更新

我对 C# 代码进行了更改,因此它使用的块大小为 256.但现在 hello world 看起来像这样 http://pastebin.com/5sXhMV11 并且我无法弄清楚我应该使用 rtrim() 来摆脱最后的混乱.

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

再次感谢!

我正在尝试使用用 C# 加密的 PHP 解密字符串.我似乎无法让 PHP 使用 mcrypt 解密它,请帮忙.我在使用 php 时遇到以下错误,所以我猜我没有正确设置 IV.

错误:IV参数必须和blocksize一样长

两个函数使用相同的密码、密钥、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);字符串加密=空;RijndaelManaged rj = new RijndaelManaged();rj.Key = 密钥;rj.IV = IV;rj.Mode = CipherMode.CBC;尝试{MemoryStream ms = new MemoryStream();使用 (CryptoStream cs = new CryptoStream(ms, rj.CreateEncryptor(Key, IV), CryptoStreamMode.Write)){使用 (StreamWriter sw = new StreamWriter(cs)){sw.Write(消息);sw.关闭();}cs.Close();}字节 [] 编码 = ms.ToArray();加密 = Convert.ToBase64String(encoded);女士关闭();}捕获(加密异常 e){Console.WriteLine("发生密码错误:{0}", e.Message);返回空;}catch (UnauthorizedAccessException e){Console.WriteLine("发生文件错误:{0}", e.Message);返回空;}捕获(例外 e){Console.WriteLine("发生错误:{0}", e.Message);}最后{rj.清除();}返回加密;}

PHP

var $mcrypt_cipher = MCRYPT_RIJNDAEL_256;var $mcrypt_mode = MCRYPT_MODE_CBC;函数解密($key,$iv,$encrypted){$encrypted = base64_decode($encrypted);$decrypted = rtrim(mcrypt_decrypt($this->mcrypt_cipher, $key, $encrypted, $this->mcrypt_mode, $iv), "");;返回 $decrypted;}

谢谢

解决方案

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

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

然后你的 iv 也必须是 256 位长.
请参见 SymmetricAlgorithm.BlockSize 属性><小时>

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

mcrypt_cipher, $key, base64_decode($encrypted), $this->mcrypt_mode, $iv_utf);}}$encrypted = "UmzUCnAzThH0nMkIuMisqg==";$key = "qwertyuiopasdfghjklzxcvbnmqwerty";$iv = "1234567890123456";$foo = 新 Foo;echo $foo->decrypt($key, $iv, $encrypted);

打印hello world

UPDATED

I have made the changes to the C# code so it uses a block size of 256. but now the hello world looks like this http://pastebin.com/5sXhMV11 and I cant figure out what I should use with rtrim() to get ride of the mess at the end.

Also when you say the IV should be random, by this do you mean don't use the same IV more then once or is the way I have coded it wrong?

Thanks again!

Hi,

I'm trying to decrypt a string with PHP that was encrypted in C#. I can't seem to get PHP to decrypt it using mcrypt and could do with some help please. I get the following error with php so I am guessing I'm not setting the IV correctly.

Error: The IV parameter must be as long as the blocksize

Both functions use the same cipher, key, IV and set to CBC mode:

encrypted text from c# = UmzUCnAzThH0nMkIuMisqg==
key 32 long = qwertyuiopasdfghjklzxcvbnmqwerty
iv 16 long = 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), "");;
    return $decrypted;
}

Thanks

解决方案

If you want to use Rijndael256 in your C# application you have to set the BlockSize to 256.

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

And then your iv has to be 256 bits long as well.
see SymmetricAlgorithm.BlockSize Property


Or the other way round: Currently your C# application uses Rijndael128 and so must your php script.

<?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);

prints hello world

这篇关于Rijndael 256 在 c# 和 php 之间加密/解密?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

DeepL的翻译效果还是很强大的,如果我们要用php实现DeepL翻译调用,该怎么办呢?以下是代码示例,希望能够帮到需要的朋友。 在这里需要注意,这个DeepL的账户和api申请比较难,不支持中国大陆申请,需要拥有香港或者海外信用卡才行,没账号的话,目前某宝可以
PHP通过phpspreadsheet导入Excel日期,导入系统后,全部变为了4开头的几位数字,这是为什么呢?原因很简单,将Excel的时间设置问文本,我们就能看到该日期本来的数值,上图对应的数值为: 要怎么解决呢?进行数据转换就行,这里可以封装方法,或者用第三方的
mediatemple - can#39;t send email using codeigniter(mediatemple - 无法使用 codeigniter 发送电子邮件)
Laravel Gmail Configuration Error(Laravel Gmail 配置错误)
Problem with using PHPMailer for SMTP(将 PHPMailer 用于 SMTP 的问题)
Issue on how to setup SMTP using PHPMailer in GoDaddy server(关于如何在 GoDaddy 服务器中使用 PHPMailer 设置 SMTP 的问题)