标签: mcrypt

使用PHP和c#的Mcrypt和base64

我已经在两个平台上编写了相同的方法,我认为这些方法应该会产生相同的结果,但它并没有发生.我用相同的密钥加密了相同的文本,结果不同.有人能弄明白为什么会这样吗?

字符串:这是测试

密钥:1234567812345678

PHP加密字符串:ybUaKwQlRNwOjJhxLWtLYQ ==

C#加密字符串:r2YjEFPyDDacnPmDFcGTLA ==

C#功能

static string Encrypt(string plainText, string key)
{
    string cipherText;
    var rijndael = new RijndaelManaged()
    {
        Key = Encoding.UTF8.GetBytes(key),
        Mode = CipherMode.ECB,
        BlockSize = 128,
    };
    ICryptoTransform encryptor = rijndael.CreateEncryptor(rijndael.Key, rijndael.IV);

    using (var memoryStream = new MemoryStream())
    {
        using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
        {
            using (var streamWriter = new StreamWriter(cryptoStream))
            {
                streamWriter.Write(plainText);
                streamWriter.Flush();
            }
            cipherText = Convert.ToBase64String(memoryStream.ToArray());
            //cryptoStream.FlushFinalBlock();
        }
    }
    return cipherText;
}

private static string …
Run Code Online (Sandbox Code Playgroud)

php c# encryption base64 mcrypt

7
推荐指数
1
解决办法
7940
查看次数

PHP:警告mcrypt_generic_init():Iv大小不正确; 供应长度:12,需要:8

基本事实:

$algorithm  = MCRYPT_BLOWFISH;
$mode       = MCRYPT_MODE_CBC;
$randSource = MCRYPT_DEV_URANDOM;
Run Code Online (Sandbox Code Playgroud)

注意 这不是严格的编码问题.

语境:

CentOS 7,Apache 2.4.12和PHP 5.6.20.

我正在制作一封HTML电子邮件,其中包含"验证您的电子邮件地址"链接,可以完成注册过程.我的虚拟专用服务器上的所有内容都是UTF-8,所有表单和查询字符串输入都使用多字节(mb)函数进行处理.

背景

作为一个实验(我知道mcrypt库的年龄和状态),我试图解密Blowfish加密的查询字符串参数.假设在上升的过程中,加密序列工作正常,我收到带有链接的电子邮件.

在下来的过程中,hmac_hash()签名(SHA-512,仅用于此实验)正在运行,我能够将每个独立消息(32个字符)与其哈希校验和(128个字符)分开.分离的消息部分的Base64解码正在工作.对于每个参数,我留下复合密文,其中复合密文等于IV +基密码文本.假设我使用一个版本substr(),以获得IV和基底密文独立地(这是意料之中的).

问题

PHP: Warning  mcrypt_generic_init(): Iv size is incorrect; supplied length: 12, needed: 8
Run Code Online (Sandbox Code Playgroud)

假设我已经梳理了PHP手册和Stackoverflow.假设我已经看过类似的其他问题,但不完全像这个问题.假设我在互联网上搜索无济于事.假设我有足够的经验来mb_string正确设置.假设当我遇到当前问题时我会处理mcrypt填充.

多字节问题会干扰解密吗?

base64编码可以IV + base cipher text破坏IV吗?

base64填充可能是个问题吗?

我应该指定更具体的MCRYPT_BLOWFISH_*吗?

为什么河豚IV大小报告8个字节,但很少产生8字节IV?

我应该使用哪个substr(),substr()或者mb_substr(),对于倾向于使所有UTF-8并将所有其他输入作为多字节UTF-8处理的设置.我知道这是一个奇怪的问题,但所有的PHP手册mycrypt解密序列示例都使用substr(),没有使用mb_substr().我的网站上的所有内容都尽可能使用mb_functions,我不介意使用substr()它,如果它解决了我的问题,但它没有解决它.当我使用时mb_substr(),我收到以下警告.

PHP: Warning  mcrypt_generic_init(): Iv …
Run Code Online (Sandbox Code Playgroud)

php encryption utf-8 mcrypt

7
推荐指数
1
解决办法
1433
查看次数

准备在PHP 7.2中删除Mcrypt

因此,随着时间的推移,mcrypt将进入PHP 7.2.当然还有另一种选择:openssl.

我发现很难从mcrypt切换到openssl,使用AES 256 CBC并保留IV.我对密码学有点新意,所以我真的不知道所有内容,但我理解基础知识.

假设我有以下代码

function encrypt($masterPassword, $data) 
{
    $keySize = mcrypt_get_key_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
    $ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
    $iv = mcrypt_create_iv($ivSize, MCRYPT_DEV_URANDOM);
    $key = mb_substr(hash('SHA256', $masterPassword), 0, $keySize);
    $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_CBC, $iv);
    return base64_encode($iv . $encrypted);
}

function decrypt($masterPassword, $base64) 
{
    $keySize = mcrypt_get_key_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
    $ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
    $key = mb_substr(hash('SHA256', $masterPassword), 0, $keySize);
    $data = base64_decode($base64);
    $iv = substr($data, 0, $ivSize);
    $encrypted = substr($data, $ivSize, strlen($data));
    $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $encrypted, MCRYPT_MODE_CBC, $iv);
    return trim($decrypted); …
Run Code Online (Sandbox Code Playgroud)

php openssl mcrypt php-7.1

7
推荐指数
1
解决办法
6752
查看次数

无法使用自制软件和 php7.4 安装 mcrypt

操作系统:macOS 11 (big sur)

自制软件:2.5.12

梨版本:1.10.12

我刚刚使用自制软件(brew install php@7.4)将我的 mac 上的 php 从 php7.1 升级到 php7.4。

然后,当我尝试安装 mcrypt 扩展时,出现错误:

configure: error: mcrypt.h not found. Please reinstall libmcrypt.
ERROR: `/private/tmp/pear/install/mcrypt/configure --with-php-config=/usr/local/homebrew/opt/php@7.4/bin/php-config --with-mcrypt' failed
Run Code Online (Sandbox Code Playgroud)

这是我所做的:

  1. brew isntall mcrypt
  2. 安装pecl
  3. sudo pecl install mcrypt -- 错误出现在这里。

我试过的:

  1. 找到 mcrypt.h 并将文件手动放置到几个位置(基于 php-config),不起作用。

  2. 清理 brew 并重新安装/重新链接 mcrypt(libmcrypt),不起作用。

  3. 删除了旧 brew 版本的遗留 mcrypt 文件。

php macos homebrew mcrypt

7
推荐指数
2
解决办法
724
查看次数

我的C#和PHP解密方法有何不同?

我继承了一些C#代码,需要将它移植到PHP.这里是:

string key = "some key";
string strEncrypted = "some encrypted string";

byte[] hashedKey = new MD5CryptoServiceProvider().ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
byte[] strToDecrypt = Convert.FromBase64String(strEncrypted);

TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider();
tripleDES.Key = hashedKey;
tripleDES.Mode = CipherMode.ECB;

string strDecrypted = UTF8Encoding.UTF8.GetString(tripleDES.CreateDecryptor().TransformFinalBlock(strToDecrypt, 0, strToDecrypt.Length));
Run Code Online (Sandbox Code Playgroud)

我的PHP代码如下所示:

$key = 'some key';
$str_encrypted = 'some encrypted string';

$hashed_key = md5($key, TRUE);
$str_to_decrypt = base64_decode($str_encrypted);

// The IV isn't used for ECB, but it prevents a warning.
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_TRIPLEDES, MCRYPT_MODE_ECB), MCRYPT_RAND); 

$str_decrypted = mcrypt_decrypt(MCRYPT_TRIPLEDES, $hashed_key, $str_to_decrypt, MCRYPT_MODE_ECB, $iv);
Run Code Online (Sandbox Code Playgroud)

但是这两个解密的值并不相同,我无法弄清楚原因.我在这里和其他地方已经阅读了很多类似的问题,但它们似乎都没有解释我遇到的问题. …

php c# cryptography mcrypt

6
推荐指数
1
解决办法
1761
查看次数

mcrypt加密将一堆'%00'添加到字符串的结尾

使用OAuth并使用以下函数使用字符串加密密钥,我们称之为'foo'(实际上是OAuth令牌)

public function encrypt( $text )
{
    // add end of text delimiter
    $data = mcrypt_encrypt( MCRYPT_RIJNDAEL_128, $this->key, $text, MCRYPT_MODE_ECB, $this->iv );
    return base64_encode( $data );
}
Run Code Online (Sandbox Code Playgroud)

当我使用反函数解密它时,我最终得到:

功能:

    public function decrypt( $text )
    {
        $text = base64_decode( $text );
        return mcrypt_decrypt( MCRYPT_RIJNDAEL_128, $this->key, $text, MCRYPT_MODE_ECB, $this->iv );
    }
Run Code Online (Sandbox Code Playgroud)

结果:

foo%00%00%00%00%00%00%00%00%00%00%00%00%00%00

编辑:

再看一下,我意识到它实际上是对%00的URL编码,这意味着我的字符串以某种方式被空字符填充?所以我目前正在使用trim()来摆脱它们,但我想了解为什么会发生这种情况.

php encryption padding mcrypt

6
推荐指数
1
解决办法
2088
查看次数

为什么在PHP中加密的东西与在Ruby中加密的相同字符串不匹配?

这是我的要求:

我需要使用AES加密(包括随机iv)在PHP中加密字符串,对其进行Base64编码,然后对其进行URL编码,以便将其作为URL参数传递.

我试图在PHP和Ruby中获得相同的结果,但我不能使它工作.

这是我的PHP代码:

function encryptData($data,$iv){
    $cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
    $iv_size = mcrypt_enc_get_iv_size($cipher);
    if (mcrypt_generic_init($cipher, 'g6zys8dlvvut6b1omxc5w15gnfad3jhb', $iv) != -1){
        $cipherText = mcrypt_generic($cipher,$data );
        mcrypt_generic_deinit($cipher);
        return $cipherText;
    }
    else {
        return false;
    }
}
$data = 'Mary had a little lamb';
$iv = '96b88a5f0b9efb43';
$crypted_base64 = base64_encode(encryptData($data, $iv));
Run Code Online (Sandbox Code Playgroud)

这是我的Ruby代码:

module AESCrypt
  def AESCrypt.encrypt(data, key, iv)
    aes = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
    aes.encrypt
    aes.key = key
    aes.iv = iv
    aes.update(data) + aes.final      
  end
end

plaintext = "Mary had a little lamb"
iv = …
Run Code Online (Sandbox Code Playgroud)

php ruby openssl mcrypt

6
推荐指数
1
解决办法
2005
查看次数

Mcrypt js加密值与PHP生成的加密值不同mcrypt/Mcrypt JS解密对UTF-8字符不起作用

我一直在尝试在服务器端,PHP和客户端端实现mcrypt加密/解密技术.我正在尝试使用mcrypt.js库,因为:

<?php 
$key = 'testtesttesttesttesttesttesttest';

function string_encrypt($string, $key) {
    $crypted_text = mcrypt_encrypt(
                        MCRYPT_RIJNDAEL_128, 
                        $key, 
                        $string, 
                        MCRYPT_MODE_ECB
                    );
    return base64_encode($crypted_text);
}

function string_decrypt($encrypted_string, $key) {
    $decrypted_text = mcrypt_decrypt(
                        MCRYPT_RIJNDAEL_128, 
                        $key, 
                        base64_decode($encrypted_string), 
                        MCRYPT_MODE_ECB
                    );
    return trim($decrypted_text);
}

echo 'Provided Text:    '.$test_str = 'This is test message.';
echo '<br />';
echo 'Encyrpted Value:  '.$enc_str = string_encrypt($test_str, $key);   
echo '<br />';
echo 'Decrypted Value:  '.string_decrypt($enc_str, $key);                               
echo '<br />';
?>

<script src='rijndael.js'></script>
<script src='mcrypt.js'></script>
<script src='base64v1_0.js'></script>

<script lang='javascript'>
    var enc_str = mcrypt.Encrypt('<?php …
Run Code Online (Sandbox Code Playgroud)

php encryption mcrypt mcrypt-js

6
推荐指数
1
解决办法
7056
查看次数

我们如何在PHP中使用GCM模式加密?

我一直在阅读很多关于GCM的内容以及它有多棒,我想知道如何使用PHP进行AES-GCM认证加密.是否支持?我在Codeigniter框架文档中找到了一些对GCM的引用,这使我相信它可以在Codeigniter中使用.mcrypt()

我还在一篇关于Zend的文档中发现了一些东西.我不打算使用Codeigniter驱动程序,因为我不使用任何框架,也不打算用于我当前的项目.在我看来,如果Codeigniter能够做到这一点,那么我们应该能够没有框架.

似乎GCM是实现安全性和性能的方式(我看到非常令人印象深刻的性能数据).我的感觉是我们需要这个,但我找不到任何例子.有人必须知道如何实现这一目标.我知道OpenSSL支持它.

任何帮助将不胜感激.

php encryption aes mcrypt aes-gcm

6
推荐指数
1
解决办法
3331
查看次数

无法创建Laravel项目,因为缺少mcrypt扩展

好的,我看过很多关于这个的帖子,我花了一整天的时间来解决这个问题,但没有成功.

我正在尝试创建一个Laravel项目.我正在使用Mac(Yosemite),它运行PHP 5.5.14.机器上还有一个旧版本的PHP.当我尝试使用"laravel new projectname " 从命令行创建项目时,不会报告任何错误,但该命令只会创建一个以项目名称命名的空文件夹.我得到了"制作应用程序......"和"应用程序就绪!构建一些令人惊奇的"消息,但同样只有一个空文件夹.

如果我尝试使用此命令:composer create-project laravel/laravel projectname

我明白了:

安装laravel/laravel(v5.0.16) - 安装laravel/laravel(v5.0.16)下载:100%

projectname中创建项目 使用包信息加载composer存储库从锁定文件安装依赖项(包括require-dev)您的需求无法解析为可安装的软件包集.

问题1 - laravel/framework v5.0.16的安装请求 - > laravel/framework [v5.0.16]可满足. - laravel/framework v5.0.16需要ext-mcrypt* - >系统中缺少所请求的PHP扩展mcrypt.

在终端中,如果我输入:我得到哪个php:/ usr/bin/php/usr/bin/php -v我得到:PHP 5.5.14(cli)(内置:2014年9月9日19:09:25)版权所有(c)1997-2014 PHP Group Zend Engine v2.5.0,版权所有(c)1998-2014 Zend Technologies with Xdebug v2.2.3,Copyright(c)2002-2013,作者:Derick Rethans

我用homebrew用这个命令安装autoconf和mcrypt:brew install autoconf mcrypt

如果我再次运行该命令,我得到:警告:已安装autoconf-2.69警告:已安装mcrypt-2.6.8

由于我一直收到错误,我认为它安装在错误的地方所以,我使用这些说明编译并安装了mcrypt:[安装mcrypt php扩展] [1].我在安装过程中使用了PHP 5.5.14版.Mcrypt安装在这个目录中:/ usr/lib/php/extensions/no-debug-non-zts-20121212 /

我重新启动了Apache.我检查了我的.bash_profile以确保/ usr/bin在我的Path中.

如果我使用phpinfo()创建一个页面并在浏览器中查看它,我会看到mcrypt列在页面的"模块作者"部分中.它只列出了创建模块的人员的姓名.

我很难过.我期待着人们可能提出的任何建议(我真的不想安装虚拟盒子,或类似的东西.当然,我可以把这个模块安装在正确的位置!)

非常感谢!

php mcrypt laravel composer-php osx-yosemite

6
推荐指数
2
解决办法
2万
查看次数