2017-02-23 125 views
-1

请帮我加密全字符串“测试加密字符串”。 这里只对16个字节进行加密。 以下是我用于md5加密和解密的代码。 请帮我加密更多的字节。md5加密和解密java无法加密超过16bytes

import java.security.MessageDigest; 
import java.util.Arrays; 
import javax.crypto.Cipher; 
import javax.crypto.SecretKey; 
import javax.crypto.spec.IvParameterSpec; 
import javax.crypto.spec.SecretKeySpec; 
public class Md5Encryption 
{ 
    private static final String ALGORITHM = "md5"; 
    private static final String DIGEST_STRING = "HG58YZ3CR9"; 
    private static final String CHARSET_UTF_8 = "utf-8"; 
    private static final String SECRET_KEY_ALGORITHM = "DESede"; 
    private static final String TRANSFORMATION_PADDING = "DESede/CBC/PKCS5Padding"; 

    /* Encryption Method */ 
    public String encrypt(String message) throws Exception 
    { 
     final MessageDigest md = MessageDigest.getInstance(ALGORITHM); 
     final byte[] digestOfPassword = md.digest(DIGEST_STRING.getBytes(CHARSET_UTF_8)); 
     final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24); 
     for (int j = 0, k = 16; j < 8;) { 
       keyBytes[k++] = keyBytes[j++]; 
     } 

     final SecretKey key = new SecretKeySpec(keyBytes, SECRET_KEY_ALGORITHM); 
     final IvParameterSpec iv = new IvParameterSpec(new byte[8]); 
     final Cipher cipher = Cipher.getInstance(TRANSFORMATION_PADDING); 
     cipher.init(Cipher.ENCRYPT_MODE, key, iv); 

     final byte[] plainTextBytes = message.getBytes(CHARSET_UTF_8); 
     final byte[] cipherText = cipher.doFinal(plainTextBytes); 

     return new String(cipherText); 
    } 

    /* Decryption Method */ 
    public String decrypt(String message) throws Exception { 
     final MessageDigest md = MessageDigest.getInstance(ALGORITHM); 
     final byte[] digestOfPassword = md.digest(DIGEST_STRING.getBytes(CHARSET_UTF_8)); 
     final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24); 
     for (int j = 0, k = 16; j < 8;) { 
       keyBytes[k++] = keyBytes[j++]; 
     } 

     final SecretKey key = new SecretKeySpec(keyBytes, SECRET_KEY_ALGORITHM); 
     final IvParameterSpec iv = new IvParameterSpec(new byte[8]); 
     final Cipher decipher = Cipher.getInstance(TRANSFORMATION_PADDING); 
     decipher.init(Cipher.DECRYPT_MODE, key, iv); 

     final byte[] plainText = decipher.update(message.getBytes()); 

     return new String(plainText, CHARSET_UTF_8); 
    } 

    public static void main(String[] args) throws Exception { 


     String text = "TEST STRING TO ENCRYPT"; 
     String codedtext = new Md5Encryption().encrypt(text); 
//  String codedtext = ".ªÉ…U$L§U`8ˉ­?¦”›°„"; 
     String decodedtext = new Md5Encryption().decrypt(codedtext); 

     System.out.println(codedtext); // this is a byte array, you'll just see a reference to an array 
     System.out.println(decodedtext); // This correctly shows "TEST STRING TO ENCRYPT" 
    } 


} 
+1

MD5不是加密算法 - 它是一个(不安全)单程哈希算法。 – chrixm

+2

MD5是一种哈希算法,不是加密,因此你也不能解密它。多年来它也被认为是毫无意义的,因为它太快地被打破。 –

+0

它只是供内部使用......所以没问题 – vimal

回答

0

嗨,你是不是做MD5加密,你得到一个字符串的MD5摘要,然后用它来生成密钥,做DESede/CBC加密你。请注意,MD5不是加密,而是散列算法。细节available at this Link

散列是一种方法。你不能从一个哈希码转换你的数据/字符串。加密是2种方式 - 如果您有密钥,您可以再次解密加密的字符串。加密函数通过​​使用加密密钥将文本转换为无意义的密文,反之亦然。

而不是做一个decipher.update(..)你需要一个doFinal(..),并且也代替转换encrytped byte[]String,尝试返回byte[]encrypt和传递byte[]解密作为参数;它意味着使用的方式。下面应该解决你的问题:

import java.security.MessageDigest; 
import java.util.Arrays; 
import javax.crypto.Cipher; 
import javax.crypto.SecretKey; 
import javax.crypto.spec.IvParameterSpec; 
import javax.crypto.spec.SecretKeySpec; 
public class Md5Encryption 
{ 
    private static final String ALGORITHM = "md5"; 
    private static final String DIGEST_STRING = "HG58YZ3CR9"; 
    private static final String CHARSET_UTF_8 = "utf-8"; 
    private static final String SECRET_KEY_ALGORITHM = "DESede"; 
    private static final String TRANSFORMATION_PADDING = "DESede/CBC/PKCS5Padding"; 

    /* Encryption Method */ 
    public byte[] encrypt(String message) throws Exception 
    { 
     final MessageDigest md = MessageDigest.getInstance(ALGORITHM); 
     final byte[] digestOfPassword = md.digest(DIGEST_STRING.getBytes(CHARSET_UTF_8)); 
     final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24); 
     for (int j = 0, k = 16; j < 8;) { 
       keyBytes[k++] = keyBytes[j++]; 
     } 

     final SecretKey key = new SecretKeySpec(keyBytes, SECRET_KEY_ALGORITHM); 
     final IvParameterSpec iv = new IvParameterSpec(new byte[8]); 
     final Cipher cipher = Cipher.getInstance(TRANSFORMATION_PADDING); 
     cipher.init(Cipher.ENCRYPT_MODE, key, iv); 

     final byte[] plainTextBytes = message.getBytes(CHARSET_UTF_8); 
     final byte[] cipherText = cipher.doFinal(plainTextBytes); 

     return cipherText; 
    } 

    /* Decryption Method */ 
    public String decrypt(byte[] message) throws Exception { 
     final MessageDigest md = MessageDigest.getInstance(ALGORITHM); 
     final byte[] digestOfPassword = md.digest(DIGEST_STRING.getBytes(CHARSET_UTF_8)); 
     final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24); 
     for (int j = 0, k = 16; j < 8;) { 
       keyBytes[k++] = keyBytes[j++]; 
     } 

     final SecretKey key = new SecretKeySpec(keyBytes, SECRET_KEY_ALGORITHM); 
     final IvParameterSpec iv = new IvParameterSpec(new byte[8]); 
     final Cipher decipher = Cipher.getInstance(TRANSFORMATION_PADDING); 
     decipher.init(Cipher.DECRYPT_MODE, key, iv); 

     final byte[] plainText = decipher.doFinal(message); 

     return new String(plainText, CHARSET_UTF_8); 
    } 

    public static void main(String[] args) throws Exception { 


     String text = "TEST STRING TO ENCRYPT"; 
     byte[] codedtext = new Md5Encryption().encrypt(text); 
//  String codedtext = ".ªÉ…U$L§U`8ˉ­?¦”›°„"; 
     String decodedtext = new Md5Encryption().decrypt(codedtext); 

     System.out.println(codedtext); // this is a byte array, you'll just see a reference to an array 
     System.out.println(decodedtext); // This correctly shows "TEST STRING TO ENCRYPT" 
    } 


} 
0

上面的代码有两个问题。 1.您应该使用doFinal解密而不是更新,因为它只会解密部分数据。 2.您应该传递字节数组而不是将其转换为可能会导致差异的字符串,并且您可能会得到badpaddingexcpetion。 更正代码是如下:

import java.security.MessageDigest; 
import java.util.Arrays; 

import javax.crypto.Cipher; 
import javax.crypto.SecretKey; 
import javax.crypto.spec.IvParameterSpec; 
import javax.crypto.spec.SecretKeySpec; 
import sun.misc.BASE64Decoder; 
import sun.misc.BASE64Encoder; 

public class Md5Encryption 
{ 
    private static final String ALGORITHM = "md5"; 
    private static final String DIGEST_STRING = "HG58YZ3CR9"; 
    private static final String CHARSET_UTF_8 = "utf-8"; 
    private static final String SECRET_KEY_ALGORITHM = "DESede"; 
    private static final String TRANSFORMATION_PADDING = "DESede/CBC/PKCS5Padding"; 

/* Encryption Method */ 
public byte[] encrypt(String message) throws Exception 
{ 
    final MessageDigest md = MessageDigest.getInstance(ALGORITHM); 
    final byte[] digestOfPassword = md.digest(DIGEST_STRING.getBytes(CHARSET_UTF_8)); 
    final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24); 
    for (int j = 0, k = 16; j < 8;) { 
      keyBytes[k++] = keyBytes[j++]; 
    } 
    System.out.println(new String(keyBytes)); 
    final SecretKey key = new SecretKeySpec(keyBytes, SECRET_KEY_ALGORITHM); 
    final IvParameterSpec iv = new IvParameterSpec(new byte[8]); 
    final Cipher cipher = Cipher.getInstance(TRANSFORMATION_PADDING); 
    cipher.init(Cipher.ENCRYPT_MODE, key, iv); 

    final byte[] plainTextBytes = message.getBytes(CHARSET_UTF_8); 
    System.out.println(new String(plainTextBytes)); 
    final byte[] cipherText = cipher.doFinal(plainTextBytes); 

    //BASE64Encoder base64encoder = new BASE64Encoder(); 
    //return base64encoder.encode(cipherText); 
    return cipherText; 
} 



/* Decryption Method */ 
    public String decrypt(byte[] message) throws Exception { 
     final MessageDigest md = MessageDigest.getInstance(ALGORITHM); 
     final byte[] digestOfPassword = md.digest(DIGEST_STRING.getBytes(CHARSET_UTF_8)); 
     final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24); 
     for (int j = 0, k = 16; j < 8;) { 
       keyBytes[k++] = keyBytes[j++]; 
     } 
     System.out.println(new String(keyBytes)); 
     final SecretKey key = new SecretKeySpec(keyBytes, SECRET_KEY_ALGORITHM); 
     final IvParameterSpec iv = new IvParameterSpec(new byte[8]); 
     final Cipher decipher = Cipher.getInstance(TRANSFORMATION_PADDING); 
     decipher.init(Cipher.DECRYPT_MODE, key, iv); 

     final byte[] plainText = decipher.doFinal(message); 

     return new String(plainText); 
    } 

    public static void main(String[] args) throws Exception { 


     String text = "TEST STRING TO ENCRYPT"; 
     byte[] codedtext = new Md5Encryption().encrypt(text); 
//  String codedtext = ".ªÉ…U$L§U`8ˉ­?¦”›°„"; 
     String decodedtext = new Md5Encryption().decrypt(codedtext); 

     System.out.println(codedtext); // this is a byte array, you'll just see a reference to an array 
     System.out.println(decodedtext); // This correctly shows "TEST STRING TO ENCRYPT" 
    } 


}