qlee

## AES算法

AES进行加/解密需要考虑下面三个设置。

### 填充

AES以128位，即16字节为单位进行操作，如果明文长度不是16的整数倍就需要进行填充，openssl默认以PKCS#7方式进行填充。PKCS#7填充时将明文长度扩充为16的整数倍，每一个填充的字节值为填充的长度。

• 如明文长度为8，填充8个字节，每个字节均为0x8。DD表示明文，08为填充。

`| DD DD DD DD DD DD DD DD 08 08 08 08 08 08 08 08 |`

• 如明文长度为16，额外填充16个字节。DD表示明文，10为填充。

`| DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD | 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 |`

## openssl命令进行加/解密

1 指定密钥和初始向量

``````\$ openssl enc -aes-128-cbc -in in.txt -out out.txt -K 12345678901234567890 -iv 12345678
``````

``````\$ openssl enc -aes-128-cbc -in in.txt -out out.txt -K 12345678901234567890 -iv 12345678 -d
``````

2 通过字符串密码加/解密

``````\$ openssl enc -aes-128-cbc -in in.txt -out out.txt -pass pass:helloworld
``````

## C中调用openssl库

`````` int do_crypt(FILE *in, FILE *out, int do_encrypt)
{
/* Allow enough space in output buffer for additional block */
unsigned char inbuf[1024], outbuf[1024 + EVP_MAX_BLOCK_LENGTH];
int inlen, outlen;
EVP_CIPHER_CTX *ctx;
/*
* Bogus key and IV: we'd normally set these from
* another source.
*/
unsigned char key[] = "0123456789abcdeF";
unsigned char iv[] = "1234567887654321";

/* Don't set key or IV right away; we want to check lengths */
ctx = EVP_CIPHER_CTX_new();
EVP_CipherInit_ex(&ctx, EVP_aes_128_cbc(), NULL, NULL, NULL,
do_encrypt);
OPENSSL_assert(EVP_CIPHER_CTX_key_length(ctx) == 16);
OPENSSL_assert(EVP_CIPHER_CTX_iv_length(ctx) == 16);

/* Now we can set key and IV */
EVP_CipherInit_ex(ctx, NULL, NULL, key, iv, do_encrypt);

for (;;) {
inlen = fread(inbuf, 1, 1024, in);
if (inlen <= 0)
break;
if (!EVP_CipherUpdate(ctx, outbuf, &outlen, inbuf, inlen)) {
/* Error */
EVP_CIPHER_CTX_free(ctx);
return 0;
}
fwrite(outbuf, 1, outlen, out);
}
if (!EVP_CipherFinal_ex(ctx, outbuf, &outlen)) {
/* Error */
EVP_CIPHER_CTX_free(ctx);
return 0;
}
fwrite(outbuf, 1, outlen, out);

EVP_CIPHER_CTX_free(ctx);
return 1;
}
``````

do_encrypt为1时加密，为0时解密。

``````\$ #加密
\$ openssl enc aes-128-cbc -in in.txt -out out.txt -K 30313233343536373839616263646546 -iv 31323334353637383837363534333 -e
\$ #解密
\$ openssl enc aes-128-cbc -in in.txt -out out.txt -K 30313233343536373839616263646546 -iv 31323334353637383837363534333 -d
``````

© 著作权归作者所有

### qlee

Android外部文件加解密及应用实践

C6C
2018/05/08
0
0

yushiwh
2018/07/11
0
0

Openssl是一个开源的用以实现SSL协议的产品，它主要包括了三个部分：密码算法库、应用程序、SSL协议库。Openssl实现了SSL协议所需要的大多数算法。 下面我将单介绍使用Openssl进行文件的对称...

2014/07/24
496
0
c# .NET RSA结合AES加密服务端和客户端请求数据

2018/08/02
0
0
PHP 迁移 Mcrypt 至 OpenSSL 加密算法详解

big_cat
03/03
157
0

[TOC] 1.1.1标签操作v-text&v-html v-text：会把data中绑定的数据值原样输出。 v-html：会把data中值输出，且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

41分钟前
5
0
VMware vSphere的两种RDM磁盘

9
0
【AngularJS学习笔记】02 小杂烩及学习总结

13
0
Linux 内核的五大创新

16
0
【Medium 万赞好文】ViewModel 和 LIveData：模式 + 反模式

17
0