这里有没有与该网站完全相同的AES加密样例Java代码?

3

http://www.hanewin.net/encrypt/aes/aes-test.htm

如果你访问这个网站并输入以下内容:
"Key In Hex":        00000000000000000000000000123456

"Plain Text in Hex": 00000000000000000000000000000000

当你点击“加密”按钮时,你会看到十六进制的密文为:
3fa9f2a6e4c2b440fb6f676076a8ba04

是否有一个Java程序可以做到这一点(即是否有一个AES库,可以将上面的“十六进制密钥”和上面的“十六进制明文”作为输入,并生成上面的十六进制密文?)?

如果有任何建议或链接可以提供这方面的Java样例代码,我将不胜感激。


看看这个是否有帮助:https://dev59.com/xXNA5IYBdhLWcg3wWsiK - Ashwin
虽然此示例使用Blowfish,但请参阅:http://docs.oracle.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.html#BlowKeyEx - ignis
谢谢大家的回复,但我仍然不清楚代码会是什么样子。 - user1068636
需要注意的是,这种模式在实践中不应使用,因为它具有较弱的安全性能。 - CodesInChaos
2个回答

12

请参见下面的代码,以了解使用JCE类执行此操作的标准方法。

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;

public class EncryptionExample {

  public static void main(String[] args) throws Exception {
    final String keyHex = "00000000000000000000000000123456";
    final String plaintextHex = "00000000000000000000000000000000";

    SecretKey key = new SecretKeySpec(DatatypeConverter
        .parseHexBinary(keyHex), "AES");

    Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
    cipher.init(Cipher.ENCRYPT_MODE, key);

    byte[] result = cipher.doFinal(DatatypeConverter
        .parseHexBinary(plaintextHex));

    System.out.println(DatatypeConverter.printHexBinary(result));
  }
}

输出:

3FA9F2A6E4C2B440FB6F676076A8BA04


1
有什么提示可以解密它吗? - exploitr
除非您只加密小于128位的数据,否则不应使用ECB(电子密码本)块模式。请参阅https://proandroiddev.com/security-best-practices-symmetric-encryption-with-aes-in-java-7616beaaade9以获取一个很好的示例。CBC或CTR是更好的选择。 - long

0

与其将字节转换为十六进制,您也可以将其转换为Base64。我喜欢使用Apache Commons来完成这项工作。以下是一个示例。

要编译,您需要额外的Apache Commons Codec jar,可以在此处获得:

http://commons.apache.org/proper/commons-codec/download_codec.cgi

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;

public class Encryptor {
    public static String encrypt(String key1, String key2, String value) {
        try {
            IvParameterSpec iv = new IvParameterSpec(key2.getBytes("UTF-8"));

            SecretKeySpec skeySpec = new SecretKeySpec(key1.getBytes("UTF-8"),
                    "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
            byte[] encrypted = cipher.doFinal(value.getBytes());
            System.out.println("encrypted string:"
                    + Base64.encodeBase64String(encrypted));
            return Base64.encodeBase64String(encrypted);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }

    public static String decrypt(String key1, String key2, String encrypted) {
        try {
            IvParameterSpec iv = new IvParameterSpec(key2.getBytes("UTF-8"));

            SecretKeySpec skeySpec = new SecretKeySpec(key1.getBytes("UTF-8"),
                    "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
            byte[] original = cipher.doFinal(Base64.decodeBase64(encrypted));

            return new String(original);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) {

        String key1 = "Bar12345Bar12345"; // 128 bit key
        String key2 = "ThisIsASecretKet";
        System.out.println(decrypt(key1, key2,
                encrypt(key1, key2, "Hello World")));
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接