我已经在两个平台上编写了相同的方法,我认为这些方法应该会产生相同的结果,但它并没有发生.我用相同的密钥加密了相同的文本,结果不同.有人能弄明白为什么会这样吗?
字符串:这是测试
密钥: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) 基本事实:
$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) 因此,随着时间的推移,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) 操作系统: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)
这是我所做的:
我试过的:
找到 mcrypt.h 并将文件手动放置到几个位置(基于 php-config),不起作用。
清理 brew 并重新安装/重新链接 mcrypt(libmcrypt),不起作用。
删除了旧 brew 版本的遗留 mcrypt 文件。
我继承了一些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)
但是这两个解密的值并不相同,我无法弄清楚原因.我在这里和其他地方已经阅读了很多类似的问题,但它们似乎都没有解释我遇到的问题. …
使用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()来摆脱它们,但我想了解为什么会发生这种情况.
这是我的要求:
我需要使用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和客户端端实现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) 我一直在阅读很多关于GCM的内容以及它有多棒,我想知道如何使用PHP进行AES-GCM认证加密.是否支持?我在Codeigniter框架文档中找到了一些对GCM的引用,这使我相信它可以在Codeigniter中使用.mcrypt()
我还在一篇关于Zend的文档中发现了一些东西.我不打算使用Codeigniter驱动程序,因为我不使用任何框架,也不打算用于我当前的项目.在我看来,如果Codeigniter能够做到这一点,那么我们应该能够没有框架.
似乎GCM是实现安全性和性能的方式(我看到非常令人印象深刻的性能数据).我的感觉是我们需要这个,但我找不到任何例子.有人必须知道如何实现这一目标.我知道OpenSSL支持它.
任何帮助将不胜感激.
好的,我看过很多关于这个的帖子,我花了一整天的时间来解决这个问题,但没有成功.
我正在尝试创建一个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列在页面的"模块作者"部分中.它只列出了创建模块的人员的姓名.
我很难过.我期待着人们可能提出的任何建议(我真的不想安装虚拟盒子,或类似的东西.当然,我可以把这个模块安装在正确的位置!)
非常感谢!
mcrypt ×10
php ×10
encryption ×5
c# ×2
openssl ×2
aes ×1
aes-gcm ×1
base64 ×1
composer-php ×1
cryptography ×1
homebrew ×1
laravel ×1
macos ×1
mcrypt-js ×1
osx-yosemite ×1
padding ×1
php-7.1 ×1
ruby ×1
utf-8 ×1