2012-12-01 479 views
2

我有这些信息:AES解密在CTR模式(Java)的

CTR键:36f18357be​​4dbd77f050515c73fcf9f2

CTR密文1:69dda8455c7dd4254bf353b773304eec0ec7702330098ce7f7520d1cbbb20fc3 \ 88d1b0adb5054dbd7370849dbf0b88d393f252e764f1f5f7ad97ef79d59ce29f5f51eeca32eabedd9afa9329

注意,16字节的加密IV被选择是随机的并且被预置为密文。文本在CTR模式下用AES加密。

我发现明文 为此,我写了一个简短的Java程序,但它不工作,我没有找到原因:/

这是Java程序

import java.nio.charset.Charset; 
import javax.crypto.Cipher; 
import javax.crypto.KeyGenerator; 
import javax.crypto.spec.IvParameterSpec; 
import javax.crypto.spec.SecretKeySpec; 

public class AES { 

/** 
* @param args 
*/ 
public static void main(String[] args) throws Exception { 
    // TODO Auto-generated method stub 

    //Dernier exemple CTR mode 
    //Clé 16 bits 
    byte[] keyBytes = new byte[] { (byte)0x36,(byte)0xf1,(byte)0x83,(byte)0x57,(byte)0xbe,(byte)0x4d,(byte)0xbd,(byte)0x77,(byte)0xf0,(byte)0x50,(byte)0x51,(byte)0x5c,0x73,(byte)0xfc,(byte)0xf9,(byte)0xf2}; 
    //IV 16 bits (préfixe du cipherText) 
    byte[] ivBytes = new byte[] {(byte)0x69,(byte)0xdd,(byte)0xa8,(byte)0x45,(byte)0x5c,(byte)0x7d,(byte)0xd4,(byte)0x25,(byte)0x4b,(byte)0xf3,(byte)0x53,(byte)0xb7,(byte)0x73,(byte)0x30,(byte)0x4e,(byte)0xec}; 

    //Initialisation 
    SecretKeySpec key = new SecretKeySpec(keyBytes, "AES"); 
    IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); 

    //Mode 
    Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding"); 

    byte[] cipherText = new byte[] {(byte)0x0e,(byte)0xc,(byte)0x77,(byte)0x02,(byte)0x33,(byte)0x00,(byte)0x98,(byte)0xce,(byte)0x7f,(byte)0x75,(byte)0x20,(byte)0xd1,(byte)0xcb,(byte)0xbb,(byte)0x20,(byte)0xfc,(byte)0x38,(byte)0x8d,(byte)0x1b,(byte)0x0a,(byte)0xdb,(byte)0x50,(byte)0x54,(byte)0xdb,(byte)0xd7,(byte)0x37,(byte)0x08,(byte)0x49,(byte)0xdb,(byte)0xf0,(byte)0xb8,(byte)0x8d,(byte)0x39,(byte)0x3f,(byte)0x25,(byte)0x2e,(byte)0x76,(byte)0x4f,(byte)0x1f,(byte)0x5f,(byte)0x7a,(byte)0xd9,(byte)0x7e,(byte)0xf7,(byte)0x9d,(byte)0x59,(byte)0xce,(byte)0x29,(byte)0xf5,(byte)0xf5,(byte)0x1e,(byte)0xec,(byte)0xa3,(byte)0x2e,(byte)0xab,(byte)0xed,(byte)0xd9,(byte)0xaf,(byte)0xa9,(byte)0x32,(byte)0x29}; 
    cipher.init(Cipher.DECRYPT_MODE, key, ivSpec); 
    byte [] original = cipher.doFinal(cipherText); 
    String plaintext = new String(original); 
    System.out.println("plaintext: " + plaintext); 
} 

}

结果是=>明文:CŸUnfpL¨KH¹)VPA | EO9}FÅgÿžQ3Š®¹zÛ~±<þãh¤ÔÆË“M±§| @ +0H5§ 所以它似乎是错误的

预先感谢您:)

+0

密文和纯文本由字节组成,而不是字符。因此,在直接翻译*系统字符集之后,您可能无法获得可打印的内容。确保你为'String'构造函数使用了正确的字符集。 –

回答

7

可能有其他的问题,但在你的问题的密文,16个第一字节后,与0ec770开始,而在Java代码中的密文与

开始
0x0e, 0xc, 0x77 

它们不匹配。

+0

何感谢JB Nizet,这是一个愚蠢的错误... – Joe