md5加解密java无法加密超过16bytes
md5 encryption and decryption java unable to encrypt more than 16bytes
请帮我加密完整的字符串"TEST STRING TO ENCRYPT"。
这里仅对 16 个字节进行加密。
下面是我的md5加密解密代码。
请帮我加密更多字节。
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"
}
}
您好,您没有进行 MD5 加密,您正在获取字符串的 MD5 摘要,然后使用它生成一个密钥,为您进行 DESede/CBC 加密。请注意,MD5 不是一种加密算法,而是一种哈希算法。详情available at this Link
Hashing is one way . You can not get convert your data/ string from a hash code. Encryption is 2 way - you can decrypt again the encrypted string if you have the key with you. Encryption function transforms a text into a nonsensical ciphertext by using an encryption key, and vice versa.
而不是做一个 decipher.update(..)
你需要一个 doFinal(..)
,而不是将加密的 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"
}
}
上面的代码有两个问题。
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"
}
}
请帮我加密完整的字符串"TEST STRING TO ENCRYPT"。 这里仅对 16 个字节进行加密。 下面是我的md5加密解密代码。 请帮我加密更多字节。
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"
}
}
您好,您没有进行 MD5 加密,您正在获取字符串的 MD5 摘要,然后使用它生成一个密钥,为您进行 DESede/CBC 加密。请注意,MD5 不是一种加密算法,而是一种哈希算法。详情available at this Link
Hashing is one way . You can not get convert your data/ string from a hash code. Encryption is 2 way - you can decrypt again the encrypted string if you have the key with you. Encryption function transforms a text into a nonsensical ciphertext by using an encryption key, and vice versa.
而不是做一个 decipher.update(..)
你需要一个 doFinal(..)
,而不是将加密的 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"
}
}
上面的代码有两个问题。 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"
}
}