`
xuanzhui
  • 浏览: 200910 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

AES加密和解密

阅读更多

本文重点在于如何在JAVA和Python中使用AES,以及相关的重要概念,而不是专门讲AES算法原理。

 

AES作为一个块加密算法 [block cipher],每次加密的明文大小固定为128bit,所以明文比较长的时候需要先分组再加密然后整合,这个过程中就会出现两个重要的因素:模式 和 填充方式。

 

 

1. 模式

分组密码工作模式,常用的包含ECB,CBC,OFB,CFB和CTR,详见 Block_cipher_mode_of_operation

 

1)ECB模式作为最简单的工作模式,直接将明文分组,每组分别加密,每个分组独立且前后文无关。

 

 


 2)CBC模式,将明文分组与前一个密文分组进行XOR运算,然后再进行加密。每个分组的加解密都依赖于前一个分组。而第一个分组没有前一个分组,因此需要一个初始化向量 IV。



 

3)其他模式不再详述,ECB模式因为其简洁性(不需要额外的初始化向量IV)仍然被广泛使用,但是已经被认为是不安全的工作模式,具体原因见上文引用的wiki,为了保证传输信息的安全性,CBC目前是个推荐的选择,而且建议每次加密使用不同的 Key 和 IV 。

 

 2. 填充方式

鉴于明文长度随机,分组之后,最后一个组往往需要补齐。

填充方式很多,详见 Padding (cryptography)

 

以下是在Java中常用的 PKCS7 它是基于字节的填充方案 [Byte padding],其特点为:

1)填充的都是相同的字节

2)该字节的值,就是要填充的字节的个数

 

举例,

假定加密块长度要求为 8 byte,数据长度为 1 byte,那么需要填充7个byte,每个byte值为0x07

 

数据: FF

PKCS7 填充: FF 07 07 07 07 07 07 07

 

如果明文正好被整除了,需要增加一个完整的填充块,方便解密时判断最后一个字节是消息字节还是填充字节。

 

PKCS7支持长度小于256字节的加密块,而Java中经常出现的是PKCS5,PKCS5可以认为是PKCS7的一个特例,只处理8字节的加密块,理论上来说PKCS5是不适用于AES加密的,但是JCA (Java Cryptography Architecture) 标准中却只有PKCS5,这个可以认为是历史原因,实际上在加密块大于8字节时,PKCS5内部就用PKCS7方式填充。

 

3. 关于秘钥Key,长度可以是 128, 192 和 256 bits(注意加密块始终是 128 bits),Java默认只支持 128 bits,如果需要支持更长的key,需要添加扩展包 Java Cryptography Extension (JCE)。

 

4. Java中加密和解密的流程

创建Cipher实例 -> 用key初始化 -> 执行加解密,分组的操作只需要在创建实例时指定模式即可,不需要手动处理

 

以 CBC 模式加密为例

public byte[] encryptCBCMode(String key, String vector, String plainText) throws
        NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException,
        InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
    IvParameterSpec iv = new IvParameterSpec(vector.getBytes(StandardCharsets.UTF_8));
    SecretKey keySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");

    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
    cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);

    return cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
}

 

解密时将 Cipher.ENCRYPT_MODE 替换为 Cipher.DECRYPT_MODE。

 

5. Python中加密和解密的流程

使用 cryptography 库,和Java流程类似,同样以 CBC 模式为例

def encrypt_cbc_mode(key, iv, plain_bytes):
	backend = default_backend()
	cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend)
	encryptor = cipher.encryptor()
	# add pkcs#7 padding before encrypt
	padder = padding.PKCS7(128).padder()
	padded_data = padder.update(plain_bytes) + padder.finalize()
	return encryptor.update(padded_data) + encryptor.finalize()

 

更多代码可以参考 Information-Security

 

 

 

 

  • 大小: 77.5 KB
  • 大小: 94.6 KB
分享到:
评论

相关推荐

    Qt实现AES加密和解密

    总之,虽然Qt本身不内置AES加密,但结合第三方库和Qt的现有组件,我们可以方便地实现AES加密和解密,为应用程序提供必要的安全保护。在开发过程中,务必遵循最佳实践,确保数据的完整性和安全性。

    基于C++的AES加密和解密代码_基于C++的AES加密和解密代码._

    在C++中实现AES加密和解密,通常会利用已有的库,如OpenSSL、Crypto++等。这些库提供了API接口,使得开发者能够方便地在C++程序中集成AES功能。例如,OpenSSL中的`EVP_EncryptInit_ex()`、`EVP_EncryptUpdate()`和`...

    matlab实现AES加密和解密算法

    在MATLAB环境中实现AES加密和解密算法是一项重要的技能,特别是在教学和科研中。MATLAB2019a版本提供了丰富的数学计算功能,使得实现这种复杂的算法变得相对简单。 AES的核心过程包括四个基本操作:字节代换...

    AES加密和解密Demo

    本教程将通过"AES加密和解密Demo"这个实例,深入探讨AES的工作原理、实现过程以及如何在实际应用中进行加密和解密。 **AES加密算法简介** AES是由比利时密码学家Joan Daemen和Vincent Rijmen设计的,2001年被美国...

    android使用AES加密和解密文件实例代码

    Android 使用 AES 加密和解密文件实例代码 在 Android 应用程序中,使用 AES(Advanced Encryption Standard)加密和解密文件是一种常见的安全措施。本文将详细介绍 Android 使用 AES 加密和解密文件的实例代码,并...

    JAVA实现AES加密和解密

    总的来说,理解并正确使用Java实现AES加密和解密,需要注意秘钥的生成、工作模式的选择、填充方式以及字符编码的一致性,这样才能确保数据的安全传输和正确解密。通过实际操作和实践,你可以更深入地掌握这些知识点...

    Java实现AES加密和解密算法

    在Java中实现AES(Advanced Encryption Standard)...总之,Java中的AES加密和解密涉及到密钥生成、密码器的使用以及数据的转换。在实现过程中,还需要考虑安全性、性能和兼容性等问题,确保加密算法的有效性和安全性。

    Java使用AES加密和解密的实例详解

    Java使用AES加密和解密的实例详解 Java使用AES加密和解密的实例详解主要介绍了Java使用AES加密和解密的实例详解的相关资料,需要的朋友可以参考下。 AES加密是一种对称的加密算法,可以基于相同的密钥进行加密和...

    (原创)android使用AES加密和解密文件

    这个名为`aesdemo`的压缩包文件可能包含了演示AES加密解密功能的Android项目源代码,可以下载后进行学习和实践。 总之,使用AES加密在Android上为文件提供了一种强大而安全的保护方式。然而,正确实现加密和解密...

    AES加密与解密源代码

    AES加密与解密是信息安全领域中的重要技术,用于保护数据的隐私性和安全性。AES,全称为Advanced Encryption Standard,中文名为高级加密标准,是目前广泛采用的对称加密算法。本资源是一个基于Visual Studio 2008和...

    AES加密和解密算法

    AES加密和解密算法的MATLAB实现算法,经过验证能够实现其功能,很值得大家来学习! AES_matlab\add_round_key.m AES_matlab\aes_demo.m AES_matlab\aes_init.m AES_matlab\aff_trans.m AES_matlab\cipher.m AES...

    AES加密和解密源码,Delphi源码实例

    在这个Delphi源码实例中,我们将探讨AES加密和解密的基本原理及其实现。 AES加密算法基于Rijndael算法,由比利时的Joan Daemen和Vincent Rijmen设计。它采用了128位的数据块和可变长度的密钥(128、192或256位)。...

    Qt实现AES加密解密

    这个程序应当包含了上述知识点的具体应用,你可以通过阅读源代码、编译和运行来进一步理解和学习AES加密解密的实现细节。这个实战例程可以帮助开发者更好地掌握Qt环境下的加密解密操作,提高数据安全保护能力。

    AES加密和解密-CryptoJS和Java

    AES加密和解密-CryptoJS和Java AES(Advanced Encryption Standard,高级加密标准)是一种对称加密算法,加密和解密使用相同的密钥 CryptoJS:https://github.com/brix/crypto-js

    AES加密和解密以及加解密一起的代码.rar

    `Encrypt+Encrypt`、`Decrypt`和`Encrypt`这些文件名可能代表的是AES加密和解密的代码文件或者输出文件,具体的内容需要查看源代码才能详细了解。在开发过程中,通常会编写单独的加密和解密函数,以便在不同的场景下...

    AES加密解密实验报告

    通过AES加密解密实验,学生不仅能够掌握加密和解密的基本原理,还能实际操作,提升对密码学的理解,为信息安全领域的实践工作奠定基础。同时,这也有助于培养分析和解决实际问题的能力,因为加密技术在当今数字化...

    AES单片机加密解密 C语言源代码

    总的来说,这个资源包提供了一套适用于单片机环境的AES加密解密方案,支持Keil C51和STM32平台,并且支持不同长度的密钥,适应了多样化的安全需求。对于那些需要在单片机上处理敏感数据或者构建安全通信链路的开发者...

    AES 加密和解密

    **AES加密解密详解** AES,全称Advanced Encryption Standard,即高级加密标准,是目前广泛应用于数据加密领域的标准算法之一。AES是由NIST(美国国家标准与技术研究院)在2001年正式采纳,取代了之前的DES加密算法...

    AES加密/解密算法,基于MFC下的 VC6.0

    而“AesCode”可能是一个源代码文件,包含了具体实现AES加密解密功能的C++代码。分析这个代码可以帮助我们理解AES在VC6.0下的具体实现细节,如函数定义、调用流程等。 总的来说,AES加密/解密算法在MFC下的实现涉及...

Global site tag (gtag.js) - Google Analytics