2011-08-11 56 views
3

我已经使用DES为密钥提供了字符串和加密文件。这是我所知道的。我不知道密钥是如何编码的。Java - 将字符串转换为DES密钥

还有,我可以用它来解密des.exe,这是我在网上查到:http://knowledge-republic.com/CRM/2011/07/how-to-decrypt-extract-recreate-thecus-storage-firmware/

使用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); 
    } 

并且它不起作用。

将字符串转换为密钥有哪些其他选择?

应该加上我是一个完整的密码学新手。

+0

您收到的密钥是如何编码的?它是十六进制还是base64?在将它传递给DESKeySpec构造函数之前,必须将该字符串转换为解码的字节数组。 – stevevls

+0

是不是key.getBytes()会做什么?我所拥有的钥匙实际上只是一个字符串,我不确定已经做了什么。我曾尝试使用Base64进行解码,并且抱怨说“Base64编码数据中存在非法字符”。 – kouri

+0

我试图使用UTF8,UTF16,ISO,HEX ......解码。还有其他什么? – kouri

回答

2

在SunOS手册页des(?这似乎是你的des.exe是以)表明它们键这样产生的:

的DES算法要求,其低8字节钥匙顺序位被假定为奇偶校验位。用户提供的ASCII密钥被填充为零,并且高位被设置为奇数奇偶校验位。然后DES算法忽略每个ASCII字符的低位,但由于奇偶校验,该位的信息已保存在高位中。

它还提到,最初的IV总是zero'd出来,不管你是在

操作的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编码),然后通过示例中的代码来填充密钥。无论如何,它值得一试。

+0

是的,如果这是一个听起来像的“练习”,那么这可能是非常有意义的,从引用的可执行文件的糟糕的文档来看,似乎加密是des或者3cbc模式,我会试着先测试这些密码,然后再尝试暴力破解 – aaron

+0

我试过了你已经建议和不要,我尝试使用“des -E -k”hello“进行加密/解密,其中”hello“是关键,它仍然有效,所以如果它是一个字符,那么它会填充它与0s?它已被转换成其他东西首先@ @ @完全卡住了,我想我将不得不称之为“des.exe”,而不是自己解密 – kouri

+0

是的,文档说它填充密码用0字节使它成为一个完整的8.如果你不这样做,那么关键不会是相同的,你将无法解密。您还需要确保您使用的是zero'd IV,尽管这可能是默认情况下发生的(不确定)。 – senecaso

0

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

这就是说,这是真正的炒作,我不知道我们可以跳转到它的单独的关键问题的结论。你有没有关于声称的加密算法的其他信息?如果可执行你引以作品“-d”,那么它好像加密是DES平原CBC模式:

-B:在ECB加密模式下使用DES加密,的defaut是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

+0

我刚刚使用该des.exe进行解密和加密,唯一的命令产生相同的结果是“-E”和“-D”,其中只有最后几个字符是不同的,使用相同的密钥我有得到了。其余的结果完全不同。 :(“-d”根本不起作用,你的原始密钥是什么意思? – kouri

+0

密钥有8个正常字符,所以...... 8个字节?如果是正常的UTF8? – kouri

0

我有与C#相同的问题。我最终解决了这个问题。你可以看看我的答案在这里:DES Initialization Vector in C#

一般来说,做什么des.exe,是它计算使用DES的校验和。因此,每个加密步骤都使用先前的结果,而不是在输出数组中前进。