如何使用命令行工具解密rijndael
How to decrypt rijndael with command line tool
我有第三方的加密测量数据来源,这些数据经常更新并且需要解密。我知道如何使用 mcrypt 库在 perl 或 ruby 中解密数据。
出于文档目的和便于访问,我想记录如何使用命令行工具解密密文。我已经尝试了 mcrypt 和 openssl 命令行工具,但似乎无法使用命令行工具正确解密密文。
数据以 ecb 模式使用 rijndael-128 加密。这是我无法控制的。
给定以下最小示例:
- 加密数据以二进制形式存储在文件“./ciphertext”中。
- 密文是这些字节的序列:0xfb 0x0d 0xfb 0xa2 0xfc 0x43 0x0a 0xe5 0xe8 0x8b 0x25 0xac 0x06 0x9c 0xdd 0x77
- 可以创建文件,例如在 bash 和
printf '\xfb\x0d\xfb\xa2\xfc\x43\x0a\xe5\xe8\x8b\x25\xac\x06\x9c\xdd\x77' >/tmp/ciphertext
- 加密密钥是 32 个重复字节,值为 121(在 ASCII 中是 32 个小写 "y"s)
我可以像这样用 mcrypt 解密 ruby 中的密文:
require "rubygems"
require "mcrypt"
key = "y"*32
ciphertext = IO.read("ciphertext", :encoding => "BINARY")
puts(Mcrypt.new("rijndael-128", :ecb, "y"*32).decrypt(ciphertext))
在 Perl 中是这样的:
#!/usr/bin/perl
use Crypt::Rijndael;
my $key = ("y" x 32);
my $ciphertext;
open(my $fh, '<', "ciphertext") or die "cannot open ciphertext";
{
local $/;
$ciphertext = <$fh>;
};
my $cipher = Crypt::Rijndael->new($key, Crypt::Rijndael::MODE_ECB());
print($cipher->decrypt($ciphertext) . "\n");
我想知道如何使用命令行工具,最好是openssl或mcrypt来解密这样加密的密文。我已经尝试过这些调用,但显然我无法正确调用它们:
$ mcrypt -k yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy -a rijndael-128 -m ECB -d ciphertext
Warning: It is insecure to specify keywords in the command line
An OpenPGP encrypted file has been detected.
Unknown suffix. Will append '.dc'.
File ciphertext was NOT decrypted successfully.
$ openssl enc -aes-256-ecb -d -a -K 7979797979797979797979797979797979797979797979797979797979797979 -in ciphertext -out file.txt
bad decrypt
140057024816256:error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length:../crypto/evp/evp_enc.c:559:
-a
选项告诉 openssl 密码是 base64 编码的。但这是错误的,实际上它不是 base64 编码的。此外,由于加密时未使用填充,因此您还需要指定 -nopad
选项。
openssl aes-256-ecb -d -nopad -K 7979797979797979797979797979797979797979797979797979797979797979 -in ciphertext
我有第三方的加密测量数据来源,这些数据经常更新并且需要解密。我知道如何使用 mcrypt 库在 perl 或 ruby 中解密数据。
出于文档目的和便于访问,我想记录如何使用命令行工具解密密文。我已经尝试了 mcrypt 和 openssl 命令行工具,但似乎无法使用命令行工具正确解密密文。
数据以 ecb 模式使用 rijndael-128 加密。这是我无法控制的。
给定以下最小示例:
- 加密数据以二进制形式存储在文件“./ciphertext”中。
- 密文是这些字节的序列:0xfb 0x0d 0xfb 0xa2 0xfc 0x43 0x0a 0xe5 0xe8 0x8b 0x25 0xac 0x06 0x9c 0xdd 0x77
- 可以创建文件,例如在 bash 和
printf '\xfb\x0d\xfb\xa2\xfc\x43\x0a\xe5\xe8\x8b\x25\xac\x06\x9c\xdd\x77' >/tmp/ciphertext
- 加密密钥是 32 个重复字节,值为 121(在 ASCII 中是 32 个小写 "y"s)
我可以像这样用 mcrypt 解密 ruby 中的密文:
require "rubygems"
require "mcrypt"
key = "y"*32
ciphertext = IO.read("ciphertext", :encoding => "BINARY")
puts(Mcrypt.new("rijndael-128", :ecb, "y"*32).decrypt(ciphertext))
在 Perl 中是这样的:
#!/usr/bin/perl
use Crypt::Rijndael;
my $key = ("y" x 32);
my $ciphertext;
open(my $fh, '<', "ciphertext") or die "cannot open ciphertext";
{
local $/;
$ciphertext = <$fh>;
};
my $cipher = Crypt::Rijndael->new($key, Crypt::Rijndael::MODE_ECB());
print($cipher->decrypt($ciphertext) . "\n");
我想知道如何使用命令行工具,最好是openssl或mcrypt来解密这样加密的密文。我已经尝试过这些调用,但显然我无法正确调用它们:
$ mcrypt -k yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy -a rijndael-128 -m ECB -d ciphertext
Warning: It is insecure to specify keywords in the command line
An OpenPGP encrypted file has been detected.
Unknown suffix. Will append '.dc'.
File ciphertext was NOT decrypted successfully.
$ openssl enc -aes-256-ecb -d -a -K 7979797979797979797979797979797979797979797979797979797979797979 -in ciphertext -out file.txt
bad decrypt
140057024816256:error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length:../crypto/evp/evp_enc.c:559:
-a
选项告诉 openssl 密码是 base64 编码的。但这是错误的,实际上它不是 base64 编码的。此外,由于加密时未使用填充,因此您还需要指定 -nopad
选项。
openssl aes-256-ecb -d -nopad -K 7979797979797979797979797979797979797979797979797979797979797979 -in ciphertext