Linux下利用openssl对文件进行加密和解密

转载地址:http://hi.baidu.com/edeed/item/99206a096b62d0e1ff240db8


--建立文件test.txt, 特意写入中英文

# cd /tmp
# echo "test测试" > test.txt

--开始加密, 使用aes-128-cbc算法, 也可以使用其他算法, 通过查看openssl的帮助可获知

# openssl aes-128-cbc -salt -in test.txt -out test.txt.aes
enter aes-128-cbc encryption password:<输入密码>
Verifying - enter aes-128-cbc encryption password:<确认密码>

--查看加密前后的文件大小, 加密后文件明显增大了

# ll test.txt*  
-rw-r--r--  1 root root  9 Aug 11 15:42 test.txt
-rw-r--r--  1 root root 32 Aug 11 15:43 test.txt.aes

--查看加密前后的文件内容, 加密后文件无法直接查看, 显示乱码

# cat test.txt
test测试

# cat test.txt.aes
Salted__碾RTqm6棚顱

--现在开始解密, 会提示输入密码, 如果密码有误则无法解密

# openssl aes-128-cbc -d -salt -in test.txt.aes -out test.txt.out
enter aes-128-cbc decryption password:<输入错误密码>
bad decrypt
6150:error:06065064:digital envelope routines:EVP_DecryptFinal:bad decrypt:evp_enc.c:438:

# openssl aes-128-cbc -d -salt -in test.txt.aes -out test.txt.out
enter aes-128-cbc decryption password:<输入正确密码>

--查看解密前后的文件大小, 和加密前是一样的

# ll test.txt*
-rw-r--r--  1 root root  9 Aug 11 15:42 test.txt
-rw-r--r--  1 root root 32 Aug 11 15:43 test.txt.aes
-rw-r--r--  1 root root  9 Aug 11 15:45 test.txt.out

--查看解密前后的文件内容, 和加密前是一样的

# cat test.txt.out
test测试

这种方法非常适合Linux下的文件内容保密, 呵呵....以上命令加参数比较复杂, 我们可以把命令加参数做个函数, 然后放到.bash_profile里, 这样每次登陆后直接使用函数即可, 如下:

function encryption() 

 /usr/bin/openssl aes-128-cbc -salt -in $1 -out $1.aes && rm -f $1
}
function decryption() 

 /usr/bin/openssl aes-128-cbc -d -salt -in $1.aes -out $1 && rm -f $1.aes
}

然后就可以如下使用了(注意输入参数都是原文件名, 且会自动删除原文件):

# encryption test.txt
enter aes-128-cbc encryption password:
Verifying - enter aes-128-cbc encryption password:

# decryption test.txt
enter aes-128-cbc decryption password:


# ll test.txt*  
-rw-r--r--  1 root root 9 Aug 11 15:46 test.txt
-rw-r--r--  1 root root 9 Aug 11 15:45 test.txt.out

--End--


OpenSSL进行RSA加密解密:

RSA是一个非对称加密算法。简单地说,非对称加密算法就是说加密解密一个文件需要两个密钥,一个用来加密,为公钥,一个用来解密,为私钥。证书可以用来授权公钥的使用。

介绍下Linux平台下openssl工具的简单使用:

1、生成一个密钥:

openssl  genrsa  -out  test.key  1024

这里-out指定生成文件。需要注意的是这个文件包含了公钥和私钥两部分,也就是说这个文件既可用来加密也可用来解密。后面的1024是生成密钥的长度。

2、openssl可以将这个文件中的公钥提取出来:

openssl  rsa  -in  test.key  -putout  -out  test_pub.key

-in指定输入文件,-out指定提取生成公钥的文件名。至此,我们手上就有了一个公钥,一个私钥(包含公钥)。现在可以用公钥来加密文件了。

3、在目录中创建一个hello的文本文件,然后利用此前生成的公钥加密文件:

openssl  rsautl  -encrypt  -in  hello  -inkey  test_pub.key  -pubin  -out  hello.en

-in指定要加密的文件,-inkey指定密钥,-pubin表明是用纯公钥文件加密,-out为加密后的文件。

4、解密文件:

openssl rsautl -decrypt -in hello.en -inkey test.key -out hello.de

-in指定被加密的文件,-inkey指定私钥文件,-out为解密后的文件。


OpenSSl命令行工具验证数字签名:

一、发送方A:

生成私钥:

OpenSSL> genrsa -passout pass:123456 -out apri.pem 1024

生成公钥:

OpenSSL> rsa -passin pass:123456 -pubout -in apri.pem -out apub.pem

用B的公钥加密数据:

OpenSSL> rsautl -encrypt -pubin -inkey bpub.pem -in data.txt -out edata.txt

计算数据的消息摘要:

OpenSSL> dgst -sha1 -out md.txt data.txt

用A的私钥给消息摘要签名:

OpenSSL> rsautl -sign -inkey apri.pem -in md.txt -out signature.bin

将edata.txt和signature.bin发送给接收方B

二、接收方B

生成私钥:

OpenSSL> genrsa -passout pass:654321 -out bpri.pem 1024

生成公钥:

OpenSSL> rsa -passin pass:654321 -pubout -in bpri.pem -out bpub.pem

 

用B的私钥解密数据:

OpenSSL> rsautl -decrypt -inkey bpri.pem -in edata.txt -out data.txt

计算data.txt的信息摘要:

OpenSSL> dgst -sha1 -out ms2.txt data.txt

用A的公钥解密数字签名:

OpenSSL> rsautl -verify -pubin -inkey apub.pem -in signature.bin -out ms3.txt

最后比较:ms2.txt 和ms3.txt内容完全相同:

SHA1(data.txt)= ad6910d33d5f96cbd7b9b3378107b8b04ba1c138


  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用 OpenSSL 库来实现 Linux 下的 AES 加密解密程序。以下是一个简单的示例程序: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/aes.h> #define AES_BLOCK_SIZE 16 int main(int argc, char *argv[]) { AES_KEY aes_key; unsigned char key[AES_BLOCK_SIZE] = {'k', 'e', 'y', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'a', 'b', 'c'}; unsigned char iv[AES_BLOCK_SIZE] = {'i', 'v', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'a', 'b', 'c', 'd'}; unsigned char plaintext[] = "Hello, world!"; unsigned char ciphertext[sizeof(plaintext)]; unsigned char decryptedtext[sizeof(plaintext)]; int plaintext_len = strlen((char *) plaintext); int ciphertext_len, decryptedtext_len; AES_set_encrypt_key(key, AES_BLOCK_SIZE * 8, &aes_key); AES_cbc_encrypt(plaintext, ciphertext, plaintext_len, &aes_key, iv, AES_ENCRYPT); ciphertext_len = strlen((char *) ciphertext); AES_set_decrypt_key(key, AES_BLOCK_SIZE * 8, &aes_key); AES_cbc_encrypt(ciphertext, decryptedtext, ciphertext_len, &aes_key, iv, AES_DECRYPT); decryptedtext_len = strlen((char *) decryptedtext); printf("Plaintext: %s\n", plaintext); printf("Ciphertext: "); for(int i = 0; i < ciphertext_len; i++) printf("%x", ciphertext[i]); printf("\n"); printf("Decrypted text: %s\n", decryptedtext); return 0; } ``` 在该程序中,我们使用了 OpenSSL 库中 AES 加密算法的 CBC 模式。首先,我们需要定义一个 16 字节的密钥和初始化向量(IV)。然后,我们使用 `AES_set_encrypt_key()` 函数设置加密密钥,并使用 `AES_cbc_encrypt()` 函数加密明文。加密后的密文存储在 `ciphertext` 数组中,并使用 `strlen()` 函数计算密文长度。 接下来,我们使用 `AES_set_decrypt_key()` 函数设置解密密钥,并使用 `AES_cbc_encrypt()` 函数解密密文。解密后的明文存储在 `decryptedtext` 数组中,并使用 `strlen()` 函数计算明文长度。 最后,我们输出原始明文、加密后的密文和解密后的明文,以验证加密解密过程是否正确。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值