3

我得到了一个字符串形式的密钥和一个使用 DES 的加密文件。这是我所知道的。我不知道密钥是如何编码的。

还有一个可以用来解密的des.exe,这是我在网上找到的全部:http: //knowledge-republic.com/CRM/2011/07/how-to-decrypt-extract-recreate-thecus -存储固件/

使用 des.exe,它使用的唯一命令是“-D”,而不是“-d”。

我的目标是使用 Java 来做同样的事情。我从某个地方复制并粘贴了这个

    String key = "blah";
    DESKeySpec dks = new DESKeySpec(key.getBytes());
    SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
    SecretKey desKey = skf.generateSecret(dks);
    System.out.println(desKey);

    Cipher cipher = Cipher.getInstance("DES"); // DES/ECB/PKCS5Padding for SunJCE

    if (mode == Cipher.DECRYPT_MODE) {
        cipher.init(Cipher.DECRYPT_MODE, desKey);
        CipherOutputStream cos = new CipherOutputStream(os, cipher);
        doCopy(is, cos);
    }

它不起作用。

将字符串转换为键还有哪些其他选项?

可能应该补充一下,我是密码学的新手。

4

3 回答 3

2

des的 SunOS 手册页(这似乎是您的 des.exe 所基于的?)表明它们的密钥是这样生成的:

DES 算法需要一个 8 字节的密钥,其低位被假定为奇校验位。用户提供的 ASCII 密钥用 0 填充到 8 个字节,高位设置为奇校验位。然后 DES 算法会忽略每个 ASCII 字符的低位,但由于奇偶校验,该位的信息已保存在高位中。

它还提到,无论您在什么模式下运行,初始 IV 始终为零

CBC 操作模式始终使用全零的初始值作为初始化向量,因此文件的前 8 个字节在 CBC 或 ECB 模式下都以相同的方式加密。

它还提到使用的填充使得最后一个字节始终是 0-7 之间的值,表示使用的填充字节数。这类似于 PKCS5Padding,所以也许这会起作用

由于 DES 的 CBC 和 ECB 模式需要以 8 个字节为单位进行加密,因此被 des 命令加密的文件会附加 1 到 8 个字节,使其成为 8 个字节的倍数。最后一个字节在解密时给出最后 8 个字节中要保存的字节数(0 到 7)。附加到输入的其他字节在加密之前是随机的。

根据您指示使用的选项,听起来您正在使用 DES/CBC/PKCS5Padding 作为密码。

我认为这只是决定如何实际派生密钥。我在exampledepot上找到了这个示例代码,它可能对你有用。我认为您只需将字符串密码转换为 8 个字节(每个字符 1 个字节,因此没有 UTF 编码),然后通过示例中的代码将其填充以派生密钥。无论如何,它值得一试。

于 2011-08-11T06:01:13.683 回答
0

我对 C# 有同样的问题。我最终解决了它。您可以在这里查看我的答案:DES Initialization Vector in C#

通常,des.exe 的作用是使用 DES 计算校验和。因此,每个加密步骤都使用先前的结果,而不是在输出数组中前进。

于 2013-11-26T15:25:07.777 回答
0

DES 密钥是 7 个(显然 SunJCE 使用 7 个?)或 8 个字节。检查您提供的字符串是 7 字节还是 8 字节。如果是这样,那么很有可能它是原始密钥。如果不是,它可以以某种方式编码。十六进制编码的赠品将是 0x 的前缀或 h 的后缀,并且所有字符都在 0-9,AF 范围内。您当然可以自己从十六进制转换或使用网络上的一些代码,但我通常使用 Apache 公共库 (http://commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Hex. html).

也就是说,这确实是猜测,我不确定我们是否可以得出结论,这只是钥匙本身的问题。你有关于所谓的加密算法的任何其他信息吗?如果您引用的可执行文件与“-d”一起使用,那么加密似乎是 CBC 模式下的普通 DES:

-b :在ecb加密模式下使用DES加密,默认为cbc模式

(有多种可能的模式,请参阅http://download.oracle.com/javase/1.4.2/docs/guide/security/jce/JCERefGuide.html#AppA

我会尝试将您的密码设置为“DES/CBC”。

再说一次,我不确定如何解释这个:

默认值为三倍 cbc

您可以使用此代码段来判断系统上可用的密码:http ://www.java2s.com/Code/Java/Security/ListAllProviderAndItsAlgorithms.htm

于 2011-08-11T06:01:39.490 回答