2012-04-17 94 views
0
import java.security.Key; 
    import java.security.MessageDigest; 
    import java.security.NoSuchAlgorithmException; 
    import java.security.SecureRandom; 
    import java.security.Security; 
    import java.util.Arrays; 
    import javax.crypto.Cipher; 
    import javax.crypto.KeyGenerator; 
    import javax.crypto.SecretKey; 
    import javax.crypto.spec.IvParameterSpec; 
    import javax.crypto.spec.SecretKeySpec; 
    import java.security.MessageDigest; 

public class SHAhashingexample 
    { 
     public static void main(String[] args)throws Exception 
     { 
      Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 
      String usernametohash = "123456"; 
      String salt="salty food"; 
      String userdata="hello how are you!"; 
      MessageDigest md = MessageDigest.getInstance("SHA-256"); 
      md.update((usernametohash+salt).getBytes()); 
      byte byteData[] = md.digest(); 
      System.out.println("Digested value : " + byteData); 
      StringBuffer sb = new StringBuffer(); 
      for (int i = 0; i < byteData.length; i++) 
      { 
      sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1)); 
      } 
      System.out.println("Hash code value of username : " + sb); 
       byte[] actualkey=sb.toString().getBytes(); 
      byte[] first_key = Arrays.copyOf(actualkey, 16); 
      Key key = new SecretKeySpec(first_key, "AES"); 
      System.out.println("Derived AES key is "+key.toString()); 
      SecureRandom random = new SecureRandom(); 
      IvParameterSpec ivSpec = createCtrIvForAES(1, random); 
      Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding", "BC"); 
      cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec); 
      byte[] cipherText = cipher.doFinal(userdata.getBytes()); 
      System.out.println("ciphertext is : " + cipherText); 
      cipher.init(Cipher.DECRYPT_MODE, key, ivSpec); 
      byte[] plainText = cipher.doFinal(cipherText) ; 
      System.out.println("plaintext is : " + plainText); 

      } 

     public static IvParameterSpec createCtrIvForAES(int messageNumber, SecureRandom random) 
     { 
      byte[] ivBytes = new byte[16]; 
      random.nextBytes(ivBytes); 
      for (int i = 0; i < 16; i++) 
      { 
       ivBytes[i] = 0; 
      } 
      return new IvParameterSpec(ivBytes); 
      } 
    } 

我的意图是从用户名散列和硬编码随机数派生出128位密钥,采用算法SHA-256和AES CTR模式。想要生成用户名散列使用SHA-256算法。我觉得我们需要IV与CTR模式一起使用,初始化向量的值应该是什么,我只是猜测它们全部为零...当我解密时,我没有得到正确的明文

+1

首先让它成为一个更简单的问题。如果你不做你想要的密钥生成,你的加密/解密是否对称? – 2012-04-17 04:37:46

+0

我可以知道初始化向量的使用以及何时以及如何使用它......我实际上在网上复制了一些程序,并对其进行了修改并如上所述。 – 2012-04-17 07:34:27

回答

1

你在这里做了很多错误的事情,但您的实际问题是您忘记使用new String(plainText)从返回的值重新创建字符串。

一切都达到并包括密钥推导也不好。尝试使用PBKDF2找到一些Java样本(本网站应该有很多),并尝试理解Java中的(字符)编码。

相关问题