1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 对称加密算法(AES加密)以及对称算法与非对称算法的对比

对称加密算法(AES加密)以及对称算法与非对称算法的对比

时间:2018-06-05 19:48:03

相关推荐

对称加密算法(AES加密)以及对称算法与非对称算法的对比

概述

对称加密算法就是传统的用一个密码进行加密和解密。例如,我们常用的WinZIP 和WinRAR对压缩包的加密和解密,就是使用对称加密算法:

从程序的角度着,所谓加密,就是这样一个函数,它接收密码和明文,然后输出密文:

secret = encrypt(key, message);

而解密则相反,它接收密码和密文,然后输出明文:

plain =decrypt(key, secret);

在软件开发中,常用的对称加密算法有:

密钥长度直接决定加密强度,而工作模式和填充模式可以看成是对称加密算法的参数和格式选择。Java标准库提供的算法实现并不包括所有的工作模式和所有填充模式,但是通常我们只需要挑选常用的使用就可以了。

最后注意,DES算法由于密钥过短,可以在短时间内被暴力破解,所以现在已经不安全了。

AES加密

AES算法是目前应用最广泛的加密算法。比较常见的工作模式是ECB和CBC

ECB工作模式

Java标准库提供的对称加密接口非常简单,使用时按以下步骤编写代码:

根据算法名称/工作模式/填充模式获取Cipher 实例;根据算法名称初始化一个SecretKey 实例,密钥必须是指定长度;使用SerectKey 初始化Cipher 实例,并设置加密或解密模式;传入明文或密文,获得密文或明文。

例:对字符串“Hello,World!”通过ECB工作模式进行加密和解密

import java.security.*;import java.util.Base64;import javax.crypto.*;import javax.crypto.spec.*;public class Main {public static void main(String[] args) throws Exception {// 原文:String message = "Hello, world!";System.out.println("Message(原始信息): " + message);// 128位密钥 = 16 bytes Key:byte[] key = "1234567890abcdef".getBytes();// 加密:byte[] data = message.getBytes();byte[] encrypted = encrypt(key, data);System.out.println("Encrypted(加密内容): " + Base64.getEncoder().encodeToString(encrypted));// 解密:byte[] decrypted = decrypt(key, encrypted);System.out.println("Decrypted(解密内容): " + new String(decrypted));}// 加密:public static byte[] encrypt(byte[] key, byte[] input) throws GeneralSecurityException {// 创建密码对象,需要传入算法/工作模式/填充模式Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");// 根据key的字节内容,"恢复"秘钥对象SecretKey keySpec = new SecretKeySpec(key, "AES");// 初始化秘钥:设置加密模式ENCRYPT_MODEcipher.init(Cipher.ENCRYPT_MODE, keySpec);// 根据原始内容(字节),进行加密return cipher.doFinal(input);}// 解密:public static byte[] decrypt(byte[] key, byte[] input) throws GeneralSecurityException {// 创建密码对象,需要传入算法/工作模式/填充模式Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");// 根据key的字节内容,"恢复"秘钥对象SecretKey keySpec = new SecretKeySpec(key, "AES");// 初始化秘钥:设置解密模式DECRYPT_MODEcipher.init(Cipher.DECRYPT_MODE, keySpec);// 根据原始内容(字节),进行解密return cipher.doFinal(input);}}

CBC工作模式

ECB模式是最简单的AES加密模式,它只需要一个固定长度的密钥,固定的明文会生成固定的密文,这种一对一的加密方式会导致安全性降低,更好的方式是通过CBC 模式,它需要一一个随机数作为 IV参数,这样对于同一份明文,每次生成的密文都不同.

在CBC模式下,需要一个随机生成的16字节IV参数,必须使用SecureRandom 生成。因为多了一个IvParameterSpec实例,因此,初始化方法需要调用Cipher 的一个重载方法并传如IvParameterSpec.观察输出,可以发现每次生成的IV不同,密文也不同。

例:对字符串“Hello,World!”通过ECB工作模式进行加密和解密

package com.apesource.demo04;import java.security.*;import java.util.Base64;import javax.crypto.*;import javax.crypto.spec.*;public class Main {public static void main(String[] args) throws Exception {// 原文:String message = "Hello, world!";System.out.println("Message(原始信息): " + message);// 256位密钥 = 32 bytes Key:byte[] key = "1234567890abcdef1234567890abcdef".getBytes();// 加密:byte[] data = message.getBytes();byte[] encrypted = encrypt(key, data);System.out.println("Encrypted(加密内容): " + Base64.getEncoder().encodeToString(encrypted));// 解密:byte[] decrypted = decrypt(key, encrypted);System.out.println("Decrypted(解密内容): " + new String(decrypted));}// 加密:public static byte[] encrypt(byte[] key, byte[] input) throws GeneralSecurityException {// 设置算法/工作模式CBC/填充Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");// 恢复秘钥对象SecretKeySpec keySpec = new SecretKeySpec(key, "AES");// CBC模式需要生成一个16 bytes的initialization vector:SecureRandom sr = SecureRandom.getInstanceStrong();byte[] iv = sr.generateSeed(16); // 生成16个字节的随机数System.out.println(Arrays.toString(iv));IvParameterSpec ivps = new IvParameterSpec(iv); // 随机数封装成IvParameterSpec参数对象// 初始化秘钥:操作模式、秘钥、IV参数cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivps);// 加密byte[] data = cipher.doFinal(input);// IV不需要保密,把IV和密文一起返回:return join(iv, data);}// 解密:public static byte[] decrypt(byte[] key, byte[] input) throws GeneralSecurityException {// 把input分割成IV和密文:byte[] iv = new byte[16];byte[] data = new byte[input.length - 16];System.arraycopy(input, 0, iv, 0, 16); // IVSystem.arraycopy(input, 16, data, 0, data.length); //密文System.out.println(Arrays.toString(iv));// 解密:Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); // 密码对象SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); // 恢复秘钥IvParameterSpec ivps = new IvParameterSpec(iv); // 恢复IV// 初始化秘钥:操作模式、秘钥、IV参数cipher.init(Cipher.DECRYPT_MODE, keySpec, ivps);// 解密操作return cipher.doFinal(data);}// 合并数组public static byte[] join(byte[] bs1, byte[] bs2) {byte[] r = new byte[bs1.length + bs2.length];System.arraycopy(bs1, 0, r, 0, bs1.length);System.arraycopy(bs2, 0, r, bs1.length, bs2.length);return r;}}

对称加密算法与非对称加密算法的对比

说到非对称加密算法首先先了解一下它的概念。非对称加密算法:加密和解密使用的不是相同的密钥,只有同一个公钥——私钥对才能正常加解密。

非对称加密的优点:对称加密需要协商密钥,而非对称加密可以安全地公开各自的公钥,在N个人之间通信的时候:使用非对称加密只需要N个密钥对,每个人只管理自己的密钥对。而使用对称加密需要则需要N*(N-1)/2个密钥,因此每个人需要管理N-1个密钥,密钥管理难度大 ,而且非常容易泄漏。

非对称加密的缺点:运算速度非常慢,比对称加密要慢很多。

所以,在实际应用的时候,非对称加密总是和对称加密一起使用。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。