Java 对称加密 返回首页

发表于 2020-01-02 | 本文共 995 字

Java 对称加密(Blowfish,AES,DES,3DES)

Blowfish 加密

Blowfish是一个对称密钥加密算法,由布鲁斯·施奈尔于1993年设计,现已应用在多种加密产品。Blowfish能保证很好的加密速度,并且当前为止没有发现有效地破解方法。当前为止AES比Blowfish有更广的知名度。

施奈尔设计的Blowfish算法用途广泛,意在替代老旧的DES及避免其他算法的问题与限制。Blowfish刚刚研发出的时候,大部分其他加密算法是专利所有的或属于商业(政府)机密,所以发展起来非常受限制。施奈尔则声明Blowfish的使用没有任何限制,任何国家任何人任何时候都可以随意使用Blowfish算法。

Blowfish主要包括关键的几个S盒和一个复杂的核心变换函数。

代码示例:
String password = "012345678912345678901234";
// 传入密钥时,使用 password.getBytes() 转 byte[] 即可
private static SecretKey generateBLKey(byte[] password) throws Exception {
    return new SecretKeySpec(password, "Blowfish");
}
//java 1.8 支持 如下的工作模式和填充方式
//加解密算法/工作模式/填充方式
//Blowfish/ECB/ PKCS5Padding
//Blowfish/CBC/ NoPadding
//Blowfish/CFB/ ISO10126Padding
public static byte[] encryptBL(SecretKey key, String text) throws Exception  {
    Cipher cipher = Cipher.getInstance("Blowfish/ECB/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, key);
    return cipher.doFinal(text.getBytes());
}
public static byte[] decryptBL(SecretKey key,byte[] bt) throws Exception  {
    Cipher cipher = Cipher.getInstance("Blowfish/ECB/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, key);
    return cipher.doFinal(bt);
 }

AES

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijndael为名投稿高级加密标准的甄选流程。(Rijndael的发音近于”Rhine doll”)

代码示例:
// jdk 1.7 1.8 不支持AES的 SecretKeyFactory,可以使用secretKeySpec生成密钥
String password = "012345678912345678901234";
// 传入密钥时,使用 password.getBytes() 转 byte[] 即可
private static SecretKey generateAESKey(byte[]password) throws Throwable {
    return new SecretKeySpec(password, "AES");
}
//IV 初始向量(英语:initialization vector,)是一个固定长度的输入值。一般的使用上会要求它是随机数或拟随机数(pseudorandom),这里为了简单 使用 16位的空byte[];
public static final byte[] encrypt(String plainText, SecretKey key) {
    try {
        Cipher cipher = Cipher.getInstance(DEFAULT_TRANSFORMATION);
        cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(new byte[16]));
        return cipher.doFinal(plainText.getBytes("UTF-8"));
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}
public static final byte[] decrypt(byte[] cipherText, SecretKey key) {
    try {
        Cipher cipher = Cipher.getInstance(DEFAULT_TRANSFORMATION);
        cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(new byte[16]));
        return cipher.doFinal(cipherText);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

DES

数据加密标准(英语:Data Encryption Standard,缩写为 DES)是一种对称密钥加密块密码算法,1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛流传开来。它基于使用56位密钥的对称算法。这个算法因为包含一些机密设计元素,相对短的密钥长度以及怀疑内含美国国家安全局(NSA)的后门而在开始时有争议,DES因此受到了强烈的学院派式的审查,并以此推动了现代的块密码及其密码分析的发展。

DES现在已经不是一种安全的加密方法,主要因为它使用的56位密钥过短。1999年1月,distributed.net电子前哨基金会合作,在22小时15分钟内即公开破解了一个DES密钥。也有一些分析报告提出了该算法的理论上的弱点,虽然在实际中难以应用。为了提供实用所需的安全性,可以使用DES的派生算法3DES来进行加密,虽然3DES也存在理论上的攻击方法。在2001年,DES作为一个标准已经被高级加密标准(AES)所取代。另外,DES已经不再作为国家标准科技协会(前国家标准局)的一个标准。

在某些文献中,作为算法的DES被称为DEAData Encryption Algorithm,数据加密算法),以与作为标准的DES区分开来。在发音时,DES可以作为缩写按字母拼出来(/ˌdiːˌiːˈɛs/),或作为一个词念成/

示例代码
private static SecretKey generateDESKey(byte[]password) throws  Throwable{
    DESKeySpec desKey = new DESKeySpec(password);
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
    return keyFactory.generateSecret(desKey);
}
public static byte[] encrypt(byte[] data, SecretKey key) throws  Throwable{
    Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE,key);
    return cipher.doFinal(data);
}
public static byte[] decrypt(byte[] data, SecretKey key) throws  Throwable{
    Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, key);
    return cipher.doFinal(data);
}

3DES

密码学中,三重数据加密算法(英语:Triple Data Encryption Algorithm,缩写为TDEA,Triple DEA),或称3DES(Triple DES),是一种对称密钥加密块密码,相当于是对每个数据块应用三次数据加密标准(DES)算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。

代码示例

private static SecretKey generate3DESKey(byte[]password) throws  Throwable{
    DESedeKeySpec desKey = new DESedeKeySpec(password);
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("TripleDES");
    return keyFactory.generateSecret(desKey);
}
public static byte[] encrypt(byte[] data, Key key) throws  Throwable{
    Cipher cipher = Cipher.getInstance("TripleDES/ECB/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE,key);
    return cipher.doFinal(data);
}
public static byte[] decrypt(byte[] data, Key key) throws  Throwable{
    Cipher cipher = Cipher.getInstance("TripleDES/ECB/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, key);
    return cipher.doFinal(data);
}

参考内容

1.https://zh.wikipedia.org/wiki/Blowfish

2.https://zh.wikipedia.org/wiki/%E5%88%86%E7%BB%84%E5%AF%86%E7%A0%81%E5%B7%A5%E4%BD%9C%E6%A8%A1%E5%BC%8F

3.https://zh.wikipedia.org/wiki/%E9%AB%98%E7%BA%A7%E5%8A%A0%E5%AF%86%E6%A0%87%E5%87%86

4.https://zh.wikipedia.org/wiki/%E8%B3%87%E6%96%99%E5%8A%A0%E5%AF%86%E6%A8%99%E6%BA%96

5.https://zh.wikipedia.org/wiki/3DES


显示评论