龙空技术网

网络传输数据加密算法实现详细步骤,有demo

J小劲 573

前言:

现时看官们对“aes128加密算法的密钥”大致比较着重,各位老铁们都需要剖析一些“aes128加密算法的密钥”的相关资讯。那么小编也在网摘上收集了一些关于“aes128加密算法的密钥””的相关内容,希望咱们能喜欢,同学们一起来学习一下吧!

最近工作中需要与外部团队对接接口。我选择了webService作为rpc框架。与对方商量之后,选择了使用AES来对接口数据进行加密。在这里跟大家分享一下AES实现规则,以及我项目中怎么运用的,下边有demo示例。

这里也大概画图说一下现在市场上的加密的算法。大家如果有啥不一样或者需要补充的可以联系我。

对称加密和非对称加密

在这里简单介绍下对称加密算法与非对称加密算法的区别。 以后会详细的发一下非对称加密算法的实现步骤

对称加密算法

加密和解密用到的密钥是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合。缺点是密钥的传输比较麻烦。

非对称加密算法

加密和解密用的密钥是不同的,这种加密方式是用数学上的难解问题构造的,通常加密解密的速度比较慢,适合偶尔发送数据的场合。优点是密钥传输方便。常见的非对称加密算法为RSA、ECC和EIGamal。

实际中,一般是RSA和AES两者搭配使用。通过RSA来加密AES的密钥,传输到接收方,接收方解密得到AES密钥,然后发送方和接收方用AES密钥来通信。

什么是AES加密?

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

下面简单介绍下各个部分的作用与意义:

明文P

没有经过加密的数据。

密钥K

用来加密明文的密码,在对称加密算法中,加密与解密的密钥是相同的。密钥为接收方与发送方协商产生,但不可以直接在网络上传输,否则会导致密钥泄漏,通常是通过非对称加密算法加密密钥,然后再通过网络传输给对方,或者直接面对面商量密钥。密钥是绝对不可以泄漏的,否则会被攻击者还原密文,窃取机密数据。

AES加密函数

设AES加密函数为E,则 C = E(K, P),其中P为明文,K为密钥,C为密文。也就是说,把明文P和密钥K作为加密函数的参数输入,则加密函数E会输出密文C。

密文C

经加密函数处理后的数据

AES解密函数

设AES解密函数为D,则 P = D(K, C),其中C为密文,K为密钥,P为明文。也就是说,把密文C和密钥K作为解密函数的参数输入,则解密函数会输出明文P。
AES中的一些参数与概念

AES相比同类对称加密算法速度算是非常快,比如在有AES-NI的x86服务器至少能达到几百M/s的速度。安全性在可预见的未来是基本等同的,因为即使是128位也足够复杂无法被暴力破解。现在112位密码还在商业应用,而128位是112位的几万倍,所以在实务中用128位比较划算(稍节约资源)。

AES256比128大概需要多花40%的时间,用于多出的4轮round key生成以及对应的SPN操作。另外,产生256-bit的密钥可能也需要比128位密钥多些开销,不过这部分开销应该可以忽略。安全程度自然是256比128安全,因为目前除了暴力破解,并没有十分有效的代数攻击方法。针对具体的AES-256或AES-128的软/硬件实现有特定的攻击方式,不好一概而论。

AES128和AES256主要区别是密钥长度不同(分别是128bits,256bits)、加密处理轮数不同(分别是10轮,14轮),后者强度高于前者。128bits代表着16字字节, 256bits代表着32个字节。当前AES是较为安全的公认的对称加密算法。现代密码学分为对称加密与非对称加密(公钥加密),代表算法分别有DES(现在发展为3DES)、AES与RSA等。非对称加密算法的资源消耗大于对称加密。一般是进行混合加密处理,例如使用RSA进行密钥分发、协商,使用AES进行业务数据的加解密。

AES:加密方式

ECB:工作方式

PKCS5Padding:填充方式(IOS中只有PKCS7Padding,别担心,PKCS5Padding是PKCS7Padding的一个子集,所以使用PKCS7Padding代替也是一样的)

算法/模式/填充 16字节加密后数据长度 不满16字节加密后长度

AES/CBC/NoPadding 16 不支持

AES/CBC/PKCS5Padding 32 16

AES/CBC/ISO10126Padding 32 16

AES/CFB/NoPadding 16 原始数据长度

AES/CFB/PKCS5Padding 32 16

AES/CFB/ISO10126Padding 32 16

AES/ECB/NoPadding 16 不支持

AES/ECB/PKCS5Padding 32 16

AES/ECB/ISO10126Padding 32 16

AES/OFB/NoPadding 16 原始数据长度

AES/OFB/PKCS5Padding 32 16

AES/OFB/ISO10126Padding 32 16

AES/PCBC/NoPadding 16 不支持

AES/PCBC/PKCS5Padding 32 16

AES/PCBC/ISO10126Padding 32 16

看上面的列表可以知道AES加密后要么16要么32位(前提是大于16字节)。如果不满16字节且支持加密的模式,一定是有填充量(填充方式)的,就是不满16的字节用一个默认值来填充,直到它满16位后再加密.这个填充量你可以指定,大部分语言默认有一种缺省补充量。

import org.bouncycastle.util.encoders.Base64;import org.slf4j.Logger;import javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;import java.net.URLDecoder;import java.nio.charset.Charset;public class Aes256EcbUtil {    private static Logger logger = LogUtil.getLogger(Aes256EcbUtil.class);    //请求的密钥算法的标准名称    private static String Algorithm = "AES";    // 算法/模式/补码方式  PKCS5Padding--根据上边解释的这里要补充32位  32*8=256    private static String AlgorithmProvider = "AES/ECB/PKCS5Padding";    /**     * @Description 加密     *      **/    public static String encrypt(String src, String key) {        try {            //恢复密钥            SecretKey secretKey = new SecretKeySpec(key.getBytes(), Algorithm);            //Cipher完成加密或解密工作类            Cipher cipher = Cipher.getInstance(AlgorithmProvider);            //对Cipher初始化,加密模式            cipher.init(Cipher.ENCRYPT_MODE, secretKey);            //加密data            byte[] cipherBytes = cipher.doFinal(src.getBytes(Charset.forName("utf-8")));            //加密base64            return new String(Base64.encode(cipherBytes));        } catch (Exception e) {            logger.error("Aes256EcbUtil encrypt unknown error", e);            throw BusinessException.asBusinessException(AppBusinessErrorCode.AES_ENCRYPT);        }    }    /**     * @Description 解密     *      **/    public static String decrypt(String src, String key) {        try {            //恢复密钥            SecretKey secretKey = new SecretKeySpec(key.getBytes(), Algorithm);            //Cipher完成加密或解密工作类            Cipher cipher = Cipher.getInstance(AlgorithmProvider);            //对Cipher初始化,解密模式            cipher.init(Cipher.DECRYPT_MODE, secretKey);            //先base64解密            byte[] base64Bytes = BASE64.decode(src);            //解密data            byte[] plainBytes = cipher.doFinal(base64Bytes);            return new String(plainBytes);        } catch (Exception e) {            logger.error("Aes256EcbUtil decrypt unknown error", e);            throw BusinessException.asBusinessException(AppBusinessErrorCode.AES_DECRYPT);        }    }      public static void main(String[] args) {        Long time = System.currentTimeMillis() / 1000 - 100;        String content = "{\"username\":"+"111"+",\"timestamp\":" + time + "}";        String password = "96211014567990123456789012345670";        try {            String str = encrypt(content, password);            System.out.println(str);            str = decrypt(str, password);            System.out.println(str);            System.out.println();        } catch (Exception e) {            e.printStackTrace();        }    }}

需要引用的pom文件

<dependency>        <groupId>org.bouncycastle</groupId>        <artifactId>bcprov-jdk15</artifactId>        <version>1.44</version></dependency>

标签: #aes128加密算法的密钥