标签: mcrypt

数据损坏:错误在哪里‽

最后编辑:我已经弄清楚问题是什么(请参阅下面我自己的答案),但我无法将问题标记为已回答的问题.如果有人可以回答我在下面的答案中提出的问题,也就是说,这是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)

python mcrypt cython python-extensions

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

保持秘密密钥秘密 - 在Android应用程序中..任何想法

我的一个Android应用程序中有一个mcrypt加密和解密例程.这基本上是解密通过提取的字符串.远程通话.当然,"秘密密钥"存储在代码中,但任何拥有apktool的人都可以看到代码并看到我的密钥.

无论如何加密所有Java代码,以便即使解编它也不会是可读/可理解的?

我听说过ProGuard,但从阅读它来看,似乎不足以达到这个目的.

java encryption android mcrypt

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

PHP Mcrypt,它真的有多安全?

目前我正在开发一个处理一些非常敏感的个人信息的项目,虽然它不是后备数字,但仍然是敏感的个人信息,我想尽我所能来加密并将这些信息作为安全的方式存储在mysql中尽可能.所以现在我正在积极寻找可以处理这些敏感信息的一些安全措施.

我发现加密/解密字符串和文本块的一种简单方法是使用mcrypt.但是当我在stackoverflow上搜索mcrypt时,我注意到很多人都说mcrypt不是那么安全.

所以现在我想知道,它到底有多安全?如果安全地存储密钥,是否需要大量的黑客技能,比如专业技能,才能破解和解密存储的信息?我是否需要担心一个技能很少的黑客可以解密我将要存储在mysql服务器中的加密信息?那么破解使用mcrypt加密的加密信息需要哪些技能?

如果Mcrypt不够用,那么使用gnupg扩展并不复杂的好选择是什么?

php encryption mcrypt

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

使用php加密大文件的最佳方法

我正在开发一个php项目,需要加密用户上传的文件.这个文件可以从1mb到200mb或多或少.在网上搜索,我得出的结论是,最好的方法是将文件分成4096字节的块.所以我加密每个块并将其附加到完整的加密文件.我实际上在CBC模式下使用mcrypt和AES-256加密.

所以,我的问题是:1)我必须为每个块创建一个新的初始向量,或者我可以获得前一个块的最后一个块的最后16个字节作为当前块的第一个块的初始向量?这将导致只有一个iv附加在加密文件的开头,而不是一个iv用于在加密的块之前附加的每个块.

2)为了添加HMAC认证.这个问题与前一个问题有关.我应该为整个文件添加它还是为每个块添加它.在这种情况下,对整个文件执行此操作是一个问题,因为它通常是在文件的开始处添加的,并且在加密文件完成之前我无法计算hmac.

3)与此相关.对于文件下载,最好是解密(以块为单位)并同时向用户发送文件,还是先解密然后再发送?

谢谢

php encryption aes mcrypt

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

使用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

我在网上关于在ubuntu上安装magento的教程,但是我在配置中得到了这个错误:php extension mcrypt must be loaded.我已经尝试过了:sudo apt-get install php5-mcrypt但这对我没用.我有同样的问题卷曲,但当我尝试:sudo apt-get install php5-curl它确实适合我.我如何使用mcrypt解决这个问题?我已经尝试重启网络服务器.

php ubuntu curl mcrypt magento

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

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
查看次数

用openssl_encrypt替换mcrypt_encrypt

你们可能知道,扩展名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)

但我有两个问题:

  1. IV长度应该是16个字符(md5给我32个),所以我得到一个PHP警告
  2. 它的输出不一样(即使我截断为16个字符)

任何人都有类似的问题(或知道如何解决它?)

顺便说一句:我正在使用PHP的开发大师版本(假设是7.1.0 alpha 3).

php mcrypt php-openssl

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

准备在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
查看次数