【问题标题】:Select different padding modes in OpenSSL commands在 OpenSSL 命令中选择不同的填充模式
【发布时间】:2015-05-10 11:15:56
【问题描述】:

我编写了一个 Java Card 小程序来进行 DES 加密/解密。 source code of my applet如果你想使用它,考虑一下 Bodewes 先生在这个源代码中发现了一些错误(这些错误在他的回答下的 cmets 中提到。所以修复它然后使用)有以下功能:

  • DES_ECB_ISO9797_M1
  • DES_ECB_ISO9797_M2
  • DES_ECB_NOPAD
  • DES_ECB_PKCS5

我对我的程序输出和在线工具的输出进行了比较,最后我发现它们不同。所以我想使用 OpenSSL 检查我的程序输出的正确性。

这些是使用 key = 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88 加密 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 的结果:

::> SendToApplet.exe -key 1122334455667788 -data 3030303030303030

Command::

Data: 3030303030303030
Key : 1122334455667788

Results::

DES_ECB_ISO9797_M1:
8E 43 CF B8 91 02 01 38 .C.....8
DES_ECB_ISO9797_M2:
A6 DE 1C D9 1B A9 EE D0 ........
DES_ECB_NOPAD:
0B FC BF EE 82 F4 8B 19 .......
DES_ECB_PKCS5:
AA 6E 4D 79 E5 0C B1 51 .nMy...Q 

问题是如何检查这些结果是否正常?

这是 OpenSSL 工具 命令和参数的列表:

OpenSSL> ?
openssl:Error: '?' is an invalid command.

Standard commands
asn1parse      ca             ciphers        crl            crl2pkcs7
dgst           dh             dhparam        dsa            dsaparam
ec             ecparam        enc            engine         errstr
gendh          gendsa         genrsa         nseq           ocsp
passwd         pkcs12         pkcs7          pkcs8          prime
rand           req            rsa            rsautl         s_client
s_server       s_time         sess_id        smime          speed
spkac          verify         version        x509

Message Digest commands (see the `dgst' command for more details)
md2            md4            md5            rmd160         sha
sha1

Cipher commands (see the `enc' command for more details)
aes-128-cbc    aes-128-ecb    aes-192-cbc    aes-192-ecb    aes-256-cbc
aes-256-ecb    base64         bf             bf-cbc         bf-cfb
bf-ecb         bf-ofb         cast           cast-cbc       cast5-cbc
cast5-cfb      cast5-ecb      cast5-ofb      des            des-cbc
des-cfb        des-ecb        des-ede        des-ede-cbc    des-ede-cfb
des-ede-ofb    des-ede3       des-ede3-cbc   des-ede3-cfb   des-ede3-ofb
des-ofb        des3           desx           idea           idea-cbc
idea-cfb       idea-ecb       idea-ofb       rc2            rc2-40-cbc
rc2-64-cbc     rc2-cbc        rc2-cfb        rc2-ecb        rc2-ofb
rc4            rc4-40

不幸的是,我可以看到与填充模式相关的任何内容(即 ISO9797_M1ISO9797_M2NOPADPKCS5 )。如何在我的命令中指定它们?

【问题讨论】:

标签: encryption openssl cryptography des


【解决方案1】:

填充发生在使用分组密码加密之前。这意味着您始终可以通过解密密文并手动验证填充来进行检查。使用openssl,您可以简单地使用-nopad-K <key in hex>,然后验证输出(首先将二进制转换为人类可读的格式)。

目前我们无法验证,因为您的小程序没有返回足够的数据;您可能忘记完成加密。

【讨论】:

  • 您的小程序没有返回足够的数据 哪种数据? 您可能忘记完成加密 这是什么意思?我把我的applet的源码贴在这里了:stackoverflow.com/questions/30148089/…可以请你帮我验证一下吗?
  • 您忘记了doFinal 返回加密数据的大小。 由于填充,返回的数据大小可能大于输入量。确定性方案总是填充,即使您只提供一个数据块。
  • 你的结果不OK;对于相同的输入,您应该具有相同的密文。 ECB 不使用 IV,它是完全确定性的。
  • 我的小程序程序错了吗? (除了用doFinal方法的输出替换dataLensetOutgoinAndSend方法)
  • 我使用这个命令G:\> openssl des-ecb -in 1.txt -out 2.txt -nosalt -K 1122334455667788 -iv 0 -base64 并将 2.txt 的内容转换为十六进制形式,以检查我的输出的正确性,我的方法是否正确?跨度>
【解决方案2】:

基于openssl doc:

所有分组密码通常使用 PKCS#5 填充,也称为标准分组填充

这是唯一受支持的填充方案。

解决方法是使用-nopad 选项并按照您提到的填充方案“手动”填充您的输入消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 2016-08-20
    相关资源
    最近更新 更多