2012-04-17 3 views
0
import java.io.*; 
import java.security.MessageDigest; 
import java.security.Security; 
import java.util.Arrays; 

import javax.crypto.Cipher; 
import javax.crypto.spec.IvParameterSpec; 
import javax.crypto.spec.SecretKeySpec; 
public class NewKey{ 
public static void main(String[] args) throws Exception { 
    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 
    String username = "[email protected]"; 
    String userdata = "depression"+" "+"headache"; 
    // Get the Key 
    byte[] key = (username).getBytes(); 
    MessageDigest sha = MessageDigest.getInstance("SHA-256"); 
    key = sha.digest(key); 
    key = Arrays.copyOf(key, 16); 

    SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");  
    System.out.println("key used is "+username); 
    System.out.println("encrypted key used is "+key); 


    Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding", "BC"); 
    final byte[] IV = {-85, -67, -5, 88, 28, 49, 49, 85,114, 83, -40, 119, -65, 91, 76, 108};// Hard coded for now 
    final IvParameterSpec ivSpec = new IvParameterSpec(IV); 

    System.out.println("Derived AES key is: " +secretKeySpec.toString().getBytes().length); 

    cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec,ivSpec); 
    byte[] encrypted = cipher.doFinal((userdata).getBytes());            
    System.out.println("encrypted userdata: " + encrypted); 

    cipher.init(Cipher.DECRYPT_MODE, secretKeySpec,ivSpec); 
    byte[] original = cipher.doFinal(encrypted); 
    String originalString = new String(original); 
    System.out.println("Original userdata: " + originalString); 
} 
} 

초기화 벡터 (IV)에 몇 가지 값을 사용했으며 AES CTR 모드를 사용하는 올바른 방법을 알고 싶습니다.패딩없이 CTR 모드를 사용하는 올바른 방법은 무엇입니까?

key = Arrays.copyOf(key, 16); 

위 문장의 목적은 무엇입니까? 은 프로그램을 강화하기위한 몇 가지 변화를 제안합니다.

답변

0

정확한 방법은 임의의 비표를 생성하는 것입니다 (IvParameterSpec은 Java에서 사용하지만 실제로는 NONCE입니다) 암호문과 함께 보내주십시오. 암호를 파생하려면 PBKDF2를 사용해야하며 getBytes() 또는 new String(byte[])은 잘 정의 된 암호 대신 기본 인코딩을 사용하기 때문에 사용해야합니다.

관련 문제