当前位置: 首页 > 知识库问答 >
问题:

PHP-mcrypt

时经纬
2023-03-14

我试图学习各种加密方法,在尝试使用Perl和PHP生成密文时遇到了一个问题。

如果我用PHP加密一个秘密,我可以用PHP和Perl解密得到的密文,但是如果我用Perl加密密文,密文是“错误的”,并且这个秘密会被PHP和Perl弄乱。。。

加密。php:

#!/usr/bin/env php
<?php

# Set up vars   
$iv = 'length16length16';
$key = 'length32length32length32length32';
$cleartext = 'password';

if( count( $argv ) > 1 )
{
    $cleartext = $argv[1];
}
# --- ENCRYPTION ---
# Set up cipher
$cipher = mcrypt_module_open( MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
mcrypt_generic_init( $cipher, $key, $iv );

# Do the encryption
$ciphertext = mcrypt_generic( $cipher, $cleartext );

# Convert to HEX for print/storage
$cipher_block = implode( unpack( 'H*', $iv . $ciphertext ) );

print( "IV " . implode( unpack( 'H*', $iv ) ) );
print( "CIPH " . implode( unpack( 'H*', $ciphertext ) ) );
print( $cipher_block );

# Clean up
mcrypt_generic_deinit( $cipher );
mcrypt_module_close( $cipher );

?>

decrypt.php:

#!/usr/bin/env php
<?php

# Set up vars
$key = 'length32length32length32length32';

if( count( $argv ) > 1 )
{
    # --- DECRYPTION ---
    # Grab the hex-encoded cipherblock & convert it to binary
    $cipher_block = unpack( 'a16iv/a*ciphertext', pack( 'H*', $argv[1] ) );

    # Set up cipher
    $cipher = mcrypt_module_open( MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');

    mcrypt_generic_init( $cipher, $key, $cipher_block['iv'] );

    # Do the decryption
    $cleartext = mdecrypt_generic( $cipher, $cipher_block['ciphertext'] );

    print( $cleartext );

    # Clean up
    mcrypt_generic_deinit( $cipher );
    mcrypt_module_close( $cipher );
}

?>

加密。pl:

perl prettyprint-override">#!/usr/bin/env perl

use strict;
use warnings;

use Crypt::CBC;

# Set up vars
my $iv = 'length16length16';
my $key = 'length32length32length32length32';
my $cleartext = shift;

# --- ENCRYPTION ---
# Set up cipher
my $cipher = Crypt::CBC->new(
    -literal_key    => 1,
    -key            => $key,
    -header         => 'none',
    -iv             => $iv,
    -cipher         => 'Crypt::OpenSSL::AES');

# Do the encryption
my $ciphertext = $cipher->encrypt( $cleartext );

# Convert to HEX for print/storage
my $cipher_block = unpack( 'H*', $iv . $ciphertext );

print( "IV " . unpack( 'H*', $iv ) . "\n" );
print( "CIPH " . unpack( 'H*', $ciphertext ) . "\n" );
print( $cipher_block );

解密。pl:

#!/usr/bin/env perl

use strict;
use warnings;

use Crypt::CBC;

# Set up vars
my $key = 'length32length32length32length32';

my $cipher_block = shift;

if( $cipher_block )
{
    # --- DECRYPTION ---
    # Grab the hex-encoded cipherblock & convert it to binary
    my ($iv, $ciphertext) = unpack( 'a16a*', pack( 'H*', $cipher_block ) );

    # Set up cipher
    my $cipher = Crypt::CBC->new(
        -literal_key    => 1,
        -key            => $key,
        -header         => 'none',
        -iv             => $iv,
        -cipher         => 'Crypt::OpenSSL::AES');

    my $cleartext = $cipher->decrypt( $ciphertext );

    print( $cleartext );
}

这是我得到的输出:

$ ./encrypt.php "Secret Text"
IV 6c656e67746831366c656e6774683136
CIPH 32a47901313f47ed2ca657d3bd0c2e80
6c656e67746831366c656e677468313632a47901313f47ed2ca657d3bd0c2e80

$ ./decrypt.php 6c656e67746831366c656e677468313632a47901313f47ed2ca657d3bd0c2e80
Secret Text

$ ./decrypt.pl 6c656e67746831366c656e677468313632a47901313f47ed2ca657d3bd0c2e80
Secret Text

$ ./encrypt.pl "Secret Text"
IV 6c656e67746831366c656e6774683136
CIPH f3ae0d5f236cea77fa9ac5540d733aef
6c656e67746831366c656e677468313632a47901313f47ed2ca657d3bd0c2e80

$ ./decrypt.php 6c656e67746831366c656e677468313632a47901313f47ed2ca657d3bd0c2e80
sesswrtext

$ ./decrypt.pl 6c656e67746831366c656e677468313632a47901313f47ed2ca657d3bd0c2e80
sesswrtext

如你所见即使有相同的秘密钥匙

提前感谢。

共有1个答案

韦宏扬
2023-03-14

问题在于填充。尝试:

my $cipher = Crypt::CBC->new(
    -literal_key    => 1,
    -key            => $key,
    -header         => 'none',
    -iv             => $iv,
    -padding        => 'null', #!!!!!!!!!!!!!
    -cipher         => 'Crypt::OpenSSL::AES');

你应该得到:

CIPH 32a47901313f47ed2ca657d3bd0c2e80

无论如何-填充=

 类似资料:
  • 我是新来的。 当我在命令行中键入以下内容时: 我得到下面的错误。 需要Mcrypt PHP扩展。 后来我尝试进行故障排除。 然后我键入以下命令。 我得到的回应是: 我再次键入以下内容: 我不能再继续了。 有人能帮我吗?

  • 问题内容: 我被指示使用该方法,而不是与JQuery的Ajax请求进行交互时使用。我不了解使用vs 或全局方法的好处。 问题答案: 原因是无论内容类型如何,都将在请求的HTTP标头之后返回所有原始数据。 PHP superglobal 仅 应 包装以下任一数据 (用于简单表单发布的标准内容类型)或 (主要用于文件上传) 这是因为这些是用户代理 必须 支持的唯一内容类型。因此,服务器和PHP传统上不

  • PHP

    因此,我有一个带有注释功能的站点,其中注释的时间戳存储在MySQL数据库中。据我所知,时间戳在存储时转换为UTC,然后在检索时转换回默认时区。在我的例子中,我的服务器位于中央夏令时时区(CDT)。 我计划通过输入表单从每个用户那里获取时区。我只是想知道如何将时间戳值转换成用户的时区。 首先,我会将UTC转换为本地时区吗?或CDT到本地时区? 其次,我将如何在PHP中实现这一点?我只想: ...还是

  • php

    php tags allow php to be embedded directly into the template. They will not be escaped, regardless of the $php_handling setting. This is for advanced users only, not normally needed. php 标签允许在模板中直接嵌入

  • PHP

    PHP 网站应用如果是用 PHP 语言编写的,对 PHP 文件的请求需要用到 PHP 的解释器,它跟 Web 服务器之间需要用到 PHP-FPM。Web 服务器会把请求转发给 PHP-FPM,PHP-FPM 会使用 PHP 解释器处理请求,把结果再交给 Web 服务器。 搜索: yum search php 要安装的 PHP 的版本有很多选择,你得根据要运行的网站的需求,去安装网站应用推荐使用的

  • php

    请参考:http://www.kancloud.cn/manual/thinkphp/1819