最后编辑:我已经弄清楚问题是什么(请参阅下面我自己的答案),但我无法将问题标记为已回答的问题.如果有人可以回答我在下面的答案中提出的问题,也就是说,这是Cython中的错误还是Cython的预期行为,我会将该答案标记为已接受,因为这将是最有用的教训,恕我直言.
首先,我必须首先说我已经试图解决这个问题三天了,而我只是把头靠在墙上.从文档中我可以看出,我正在做正确的事情.显然,我不能正确地做事,因为如果我是,我就不会有问题(对吧?).
无论如何,我正在为mcrypt绑定到Python.它应该适用于Python 2和Python 3(虽然它未经Python 2测试).它可以在我的网站上找到,因为它太大而无法包含在帖子中,并且考虑到我不知道我做错了什么,我甚至无法隔离可能存在问题的代码.显示问题的脚本也在我的网站上.该脚本只提供100个块,只有字母"a"(无论加密算法/加密模式使用的块大小),当然应该得到一个"a"块作为往返的结果.但它(不总是).以下是单次运行的输出:
Wed Dec 15 10:35:44 EST 2010
test.py:5: McryptSecurityWarning: get_key() is not recommended
return ''.join(['{:02x}'.format(x) for x in o.get_key()])
key: b'\x01ez\xd5\xa9\xf9\x1f)\xa0G\xd2\xf2Z\xfc{\x7fn\x02?,\x08\x1c\xc8\x03\x061X\xb5\xc9\x99\xd0\xca'
key: b'\x01ez\xd5\xa9\xf9\x1f)\xa0G\xd2\xf2Z\xfc{\x7fn\x02?,\x08\x1c\xc8\x03\x061X\xb5\xc9\x99\xd0\xca'
16
self test result: 0
enc parameters: {'salt': '6162636465666768', 'mode': 'cbc', 'algorithm': 'rijndael-128', 'iv': '61626364616263646162636461626364'}
dec parameters: {'salt': '6162636465666768', 'mode': 'cbc', 'algorithm': 'rijndael-128', 'iv': '61626364616263646162636461626364'}
enc key: 01657ad5a9f91f29a047d2f25afc7b7f6e023f2c081cc803063158b5c999d0ca
dec key: 01657ad5a9f91f29a047d2f25afc7b7f6e023f2c081cc803063158b5c999d0ca
Stats: 88 / 100 good packets (88.0%)
#5: b'aaaaaaaaaaaaaaaa' != b'\xa6\xb8\xf9\td\x8db\xf6\x00Y"ST\xc6\x9b\xe7'
#6: …Run Code Online (Sandbox Code Playgroud) 我的一个Android应用程序中有一个mcrypt加密和解密例程.这基本上是解密通过提取的字符串.远程通话.当然,"秘密密钥"存储在代码中,但任何拥有apktool的人都可以看到代码并看到我的密钥.
无论如何加密所有Java代码,以便即使解编它也不会是可读/可理解的?
我听说过ProGuard,但从阅读它来看,似乎不足以达到这个目的.
目前我正在开发一个处理一些非常敏感的个人信息的项目,虽然它不是后备数字,但仍然是敏感的个人信息,我想尽我所能来加密并将这些信息作为安全的方式存储在mysql中尽可能.所以现在我正在积极寻找可以处理这些敏感信息的一些安全措施.
我发现加密/解密字符串和文本块的一种简单方法是使用mcrypt.但是当我在stackoverflow上搜索mcrypt时,我注意到很多人都说mcrypt不是那么安全.
所以现在我想知道,它到底有多安全?如果安全地存储密钥,是否需要大量的黑客技能,比如专业技能,才能破解和解密存储的信息?我是否需要担心一个技能很少的黑客可以解密我将要存储在mysql服务器中的加密信息?那么破解使用mcrypt加密的加密信息需要哪些技能?
如果Mcrypt不够用,那么使用gnupg扩展并不复杂的好选择是什么?
我正在开发一个php项目,需要加密用户上传的文件.这个文件可以从1mb到200mb或多或少.在网上搜索,我得出的结论是,最好的方法是将文件分成4096字节的块.所以我加密每个块并将其附加到完整的加密文件.我实际上在CBC模式下使用mcrypt和AES-256加密.
所以,我的问题是:1)我必须为每个块创建一个新的初始向量,或者我可以获得前一个块的最后一个块的最后16个字节作为当前块的第一个块的初始向量?这将导致只有一个iv附加在加密文件的开头,而不是一个iv用于在加密的块之前附加的每个块.
2)为了添加HMAC认证.这个问题与前一个问题有关.我应该为整个文件添加它还是为每个块添加它.在这种情况下,对整个文件执行此操作是一个问题,因为它通常是在文件的开始处添加的,并且在加密文件完成之前我无法计算hmac.
3)与此相关.对于文件下载,最好是解密(以块为单位)并同时向用户发送文件,还是先解密然后再发送?
谢谢
我已经在两个平台上编写了相同的方法,我认为这些方法应该会产生相同的结果,但它并没有发生.我用相同的密钥加密了相同的文本,结果不同.有人能弄明白为什么会这样吗?
字符串:这是测试
密钥: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) 我在网上关于在ubuntu上安装magento的教程,但是我在配置中得到了这个错误:php extension mcrypt must be loaded.我已经尝试过了:sudo apt-get install php5-mcrypt但这对我没用.我有同样的问题卷曲,但当我尝试:sudo apt-get install php5-curl它确实适合我.我如何使用mcrypt解决这个问题?我已经尝试重启网络服务器.
基本事实:
$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.1上弃用.
我用来维护一个"遗留"应用程序,我想最终迁移到这个版本,所以我运行测试并验证我不能再获得100%的覆盖率,因为有一段代码使用以下代码:
$key = 'sA*(DH';
// initialization vector
$iv = md5(md5($key));
$output = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, $iv));
Run Code Online (Sandbox Code Playgroud)
我试图使用此代码将此段代码移植到openssl_encrypt
$key = md5('sA*(DH');
$iv = md5($key);
echo base64_encode(openssl_encrypt($data, "aes-256-cbc", $key, OPENSSL_RAW_DATA, $iv));
Run Code Online (Sandbox Code Playgroud)
但我有两个问题:
任何人都有类似的问题(或知道如何解决它?)
顺便说一句:我正在使用PHP的开发大师版本(假设是7.1.0 alpha 3).
因此,随着时间的推移,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 文件。