当我在解密时,我没有得到正确的明文

时间:2012-04-17 04:35:09

标签: java encryption

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

我的目的是从用户名哈希和硬编码随机数中获取aes 128位密钥,采用SHA-256和AES CTR模式算法。希望使用SHA-256算法生成用户名哈希。我觉得我们需要使用IV来跟随CTR模式和初始化矢量的值应该是什么,我只是猜测它们都是零...

1 个答案:

答案 0 :(得分:1)

你在这里做了很多错事,但实际问题是你忘了使用new String(plainText)从返回的值中重新创建一个String。

所有关键的推导都包括在内。尝试使用PBKDF2找到一些Java样本(这个站点应该有很多)并尝试用Java理解(字符)编码。

相关问题