aes 加密_每日一课 | AES加密和解密(CBC模式)

2f8136be14ad1b775e1750362b87e43d.gif

通过有线方式传输诸如纯文本密码之类的机密数据总是容易受到安全性的影响,始终建议对此类信息进行加密并使用SSL传输这些机密数据.Java为此提供了多种加密算法。在本文中,我们将讨论Java中具有CBC模式的AES(高级加密标准)对称加密算法,比3DES更快,更安全。

加密方式

众所周知,加密有2种基本类型-非对称和对称加密。非对称加密使用两个不同的密钥作为公共密钥和私有密钥,可以在此处使用公共密钥对敏感信息进行加密,并使用匹配的私有密钥对相同信息进行解密。当涉及到两个不同的端点时,通常使用非对称加密,例如VPN客户端和服务器,SSH等

同样,我们还有另一种称为对称加密的加密技术。这种类型的加密使用称为私钥或秘密密钥的单个密钥对敏感信息进行加密和解密,与非对称加密相比,这种类型的加密速度非常快。对称加密的一些示例有Twofish,Blowfish,3 DES和AES。

什么是AES加密

AES代表高级加密系统及其对称加密算法,它是由美国国家标准技术研究院(NIST)于2001年建立的电子数据加密规范,此处是AES的Wiki链接 。需要使用纯文本和密钥进行加密,并且需要相同的密钥才能再次对其进行解密。

要查看AES加密的实际工作原理,可以检查一下– AES加密工具

4dc485992c55a981c6e45b111cdd8553.png

输入可以是128位或192位或256位,并生成相应的密文位。

Java中的AES加密

以下是Java中执行AES加密的示例程序。在这里,我们使用具有CBC模式的AES来加密消息,因为ECB模式在语义上并不安全.IV模式也应随机分配给CBC模式。

如果使用相同的密钥来加密所有纯文本,并且如果攻击者找到了该密钥,则可以以类似的方式解密所有密码。我们可以使用salt和迭代来进一步改进加密过程。在以下示例中,我们将使用128位加密密钥。这是在线AES加密工具 。

private static final String key = "aesEncryptionKey";private static final String initVector = "encryptionIntVec";public static String encrypt(String value) {try {
    IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
    SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);byte[] encrypted = cipher.doFinal(value.getBytes());return Base64.encodeBase64String(encrypted);
  } catch (Exception ex) {
    ex.printStackTrace();
  }return null;
}

Other Interesting Posts
Spring Boot Security Password Encoding using Bcrypt Encoder
Spring Boot Security JWT Auth Example
Spring Boot Security OAuth2 Example
Spring Boot Security REST Basic Authentication
Spring Boot Actuator Complete Guide
Spring Boot Actuator Rest Endpoints Example
Spring 5 Features and Enhancements
Spring Boot Thymeleaf Example
Spring Boot Security Hibernate Example with complete JavaConfig
Securing REST API with Spring Boot Security Basic Authentication
Websocket spring Boot Integration Without STOMP with complete JavaConfig

Java中的AES解密

以下是解密密码的相反过程。代码具有自我解释性。

public static String decrypt(String encrypted) {try {
    IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
    SecretKeySpec skeySpec = new SecretKeySpec(key.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;
}

测试AES加密和解密

以下是main()实现,以测试我们的AES实现。

public static void main(String[] args) {
  String originalString = "password";
  System.out.println("Original String to encrypt - " + originalString);
  String encryptedString = encrypt(originalString);
  System.out.println("Encrypted String - " + encryptedString);
  String decryptedString = decrypt(encryptedString);
  System.out.println("After decryption - " + decryptedString);
}

以下是结果 1b88d3e70b52e0cf845c03094df32dad.png

翻译自: https://www.javacodegeeks.com/2018/03/aes-encryption-and-decryption-in-javacbc-mode.html

今日福利?

5255f31d5d25c7302c5dc7b3ab19416b.png

推荐阅读--

当一个程序员飞速敲键盘时,他在干嘛?

卧槽!最新编程语言排名,Java 沦为老二。。

为何程序员上班时间总戴个耳机,看完恍然大悟...

每日一课 | 如何将Java对象读取和写入文件

每日一课 | Java Final关键字示例

3e249524-ff2c-eb11-8da9-e4434bdf6706.svg

球分享

3f249524-ff2c-eb11-8da9-e4434bdf6706.svg

球点赞

118928c9adaa00588577d59b89cd296a.gif

球在看

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EVP_aes_256_cbc是OpenSSL库中提供的一种加密算法,可以使用C++进行实现。下面是一个简单的示例代码: ```c++ #include <openssl/evp.h> int aes_encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key, unsigned char *iv, unsigned char *ciphertext) { EVP_CIPHER_CTX *ctx; int len; int ciphertext_len; /* 创建并初始化加密上下文 */ if(!(ctx = EVP_CIPHER_CTX_new())) return -1; /* 初始化加密操作,设置加密算法、密钥和IV */ if(1 != EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv)) return -1; /* 执行加密操作 */ if(1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len)) return -1; ciphertext_len = len; /* 结束加密操作 */ if(1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len)) return -1; ciphertext_len += len; /* 释放加密上下文 */ EVP_CIPHER_CTX_free(ctx); return ciphertext_len; } int aes_decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key, unsigned char *iv, unsigned char *plaintext) { EVP_CIPHER_CTX *ctx; int len; int plaintext_len; /* 创建并初始化解密上下文 */ if(!(ctx = EVP_CIPHER_CTX_new())) return -1; /* 初始化解密操作,设置解密算法、密钥和IV */ if(1 != EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv)) return -1; /* 执行解密操作 */ if(1 != EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len)) return -1; plaintext_len = len; /* 结束解密操作 */ if(1 != EVP_DecryptFinal_ex(ctx, plaintext + len, &len)) return -1; plaintext_len += len; /* 释放解密上下文 */ EVP_CIPHER_CTX_free(ctx); return plaintext_len; } ``` 使用示例: ```c++ unsigned char plaintext[] = "Hello, world!"; unsigned char key[] = "0123456789abcdef0123456789abcdef"; unsigned char iv[] = "0123456789abcdef"; unsigned char ciphertext[128]; unsigned char decryptedtext[128]; int decryptedtext_len, ciphertext_len; /* 加密操作 */ ciphertext_len = aes_encrypt(plaintext, strlen((char *)plaintext), key, iv, ciphertext); printf("Ciphertext is:\n"); BIO_dump_fp(stdout, (const char *)ciphertext, ciphertext_len); /* 解密操作 */ decryptedtext_len = aes_decrypt(ciphertext, ciphertext_len, key, iv, decryptedtext); decryptedtext[decryptedtext_len] = '\0'; printf("Decrypted text is:\n%s\n", decryptedtext); ``` 注意,这里的key和iv长度都为32字节,可以根据需要修改。同时,由于EVP_aes_256_cbc使用的是对称加密算法,因此在实际使用中需要保证key和iv的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值