百度
360搜索
搜狗搜索

openssl加密文件,如何用C语言来使用openssl rsa进行公钥加密,已有公钥和明文详细介绍

本文目录一览: openssl是什么软件

openssl是一个开放源代码的软件库包软件。
应用程序可以使用这个软件库包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个软件库包广泛被应用在互联网的网页服务器上。
作为一个基于密码学的安全开发包,openssl提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及ssl协议,并提供了丰富的应用程序供测试或别的目的使用。
openssl整个软件库包大概可以分成三个主要的功能部分,分别是ssl协议库、应用程序以及密码算法库。openssl的目录结构自然也是围绕这三个功能部分进行规划的。
openssl特点:
1、数据保密性。信息加密就是把明码的输入文件用加密算法转换成加密的文件以实现数据的保密。加密的过程需要用到密钥来加密数据然后再解密。没有了密钥,就无法解开加密的数据。数据加密之后,只有密钥要用一个安全的方法传送。加密过的数据可以公开地传送。
2、数据完整性。加密也能保证数据的一致性。例如:消息验证码,能够校验用户提供的加密信息,接收者可以用MAC来校验加密数据,保证数据在传输过程中没有被篡改过。
3、安全验证。加密的另外一个用途是用来作为个人的标识,用户的密钥可以作为他的安全验证的标识。ssl是利用公开密钥的加密技术来作为用户端与服务器端在传送机密资料时的加密通讯协定。

加密或解密的包名称是什么

OpenSSL。根据查询博客园官网得知,能加密或解密的包名称是OpenSSL。OpenSSL一个开源的加密库,提供了各种加密算法和协议的实现,包括AES、RSA、DES等。因此,加密或解密的包名称是OpenSSL。

解析php php

本篇文章是对php中php_openssl dll的作用进行了详细的分析介绍 需要的朋友参考下    一 openssl简介 数据加密是信息信息传输中的一个重要组成部分 任何信息都以明文方式传输 确实是个很不安全的做法 所以 需要对数据进行加密 将明文数据转换为密文数据 再进行传输
   OpenSSL是一套用于SSL/TLS协议的加密工具 其作用有: 生成私有密钥 生成证书 即数字签名证书 它包含一个公有密钥 可以用来单向的加密和解密数据 即 使用公钥加密的数据 只能使用 私有密钥解密 使用私钥加密的数据 可以使用公钥来解密 计算信息摘要 SSL/TLS客户端和服务器端测试 处理S/MIME标记和邮件的加密
   二 加密技术简介 加密 即将明文数据转换为密文数据的过程 以起到对明文保密的作用 加密算法: 数据加密过程所采用的一种运算算法 用于将明文转换为密文 密钥: 加密算法通过与密钥进行某种运算 将明文数据进行加密 生成加密数据 解密时 加密算法通过密钥 将加密数据再转换为明文数据 现今的加密技术 加密算法是公开的 即所有人都知道加密所采用的运算方式 但只有使用密钥才能进行 对密文的解密 所以 密钥的保护 是数据安全的核心
   三 openssl工具使用简介 私有密钥生成方法 生成私有密钥 可以使用不同的数字签名算法 下面分别介绍;
  #采用DSA算法 $ openssl dsaparam noout out dsakey pem genkey #采用RSA算法 $ openssl genrsa out rsakey pem #采用RSA算法 并使用密码保护 在生成私钥时 需要输入一个密码 用于保护私钥 #在使用这个私钥进行加/解密操作时 也需要输入这个密码 $ openssl genrsa des out rsakey pem 公用密钥的生成方法 根据私钥来生成公钥 #生成dsa算法的公钥 $ openssl dsa in dsakey pem pubout out dsakey pub pem #生成rsa算法的公钥 $ openssl rsa in rsakey pem pubout out rsakey pub pem 自签名证书的生成方法 #产生DSA算法的证书 $ openssl req x key dsakey pem days out mycert dsa pem new #产生RSA算法的证书 $ openssl req x key rsakey pem days out mycert rsa pem new 使用证书进行邮件加密 我们的明文信件内容:

  $ cat test txt aaaaaa 使用证书对明文信件进行加密 输出到etest txt文件: $ openssl *** ime encrypt in test txt out etest txt mycert rsa pem查看加密后的密文内容:
  $ cat etest txt MIME Version: Content Disposition: attachment; filename=" *** ime p m" Content Type: application/x pkcs mime; *** ime type=enveloped data; name= *** ime p m Content Transfer Encoding: base
  MIIBYAYJKoZIhvcNAQcDoIIBUTCCAU CAQAxgewwgekCAQAwUjBFMQswCQYDVQQG EwJBVTETMBEGA UECBMKU tZS TdGF ZTEhMB GA UEChMYSW ZXJuZXQgV lk Z l cyBQdHkgTHRkAgkAr mh NRX/UwDQYJKoZIhvcNAQEBBQAEgYCbrA WBwQK Zj TcNtrxiDzqMBc/Lu SLKvBK mQMqT+npFOOFtzIKdFVkldH YyQhMZDSCyq YUtGwOaDw Jn AHRt UwPOKoaeL RVqp vgtiFC/uXis UeyZCWS z Jsih Aa+ Da/DQN sOCX OdK/TDewNx mTaYBbVf jBZBgkqiG w BBwEwGgYIKoZIhvcN AwIwDgICAKAECNxsgiJ s+ ugDC JknPL+rDYBCddcyPH+bMYjqrUP hE/GQ WSj sv CDkOUdvY XG yiAL Z ysI=使用私钥进行解密 输出到dtest txt文件:
  $ openssl *** ime decrypt in etest txt inkey rsakey pem out dtest txt查看解密后的信件内容 与原明文信件内容完全一致
  $ cat dtest txt aaaaaa 简单的文件加密 明文文件内容:
  $ cat test txt Hello加密明文文件 输出为test enc文件 输入” ”作为加密密码:
  $ openssl enc aes cbc salt in test txt out test enc enter aes cbc encryption password: Verifying enter aes cbc encryption password:对密文进行解密 输入” ”作为解密密码:
  $ openssl enc d aes cbc in test enc enter aes cbc decryption password: Hello 简单的字符串加密 采用base 方式进行加密:
  $ echo "encode me" | openssl enc base ZW jb RlIG lCg==解密时 需要知道加密算法 才可解密:
  $ echo "ZW jb RlIG lCg==" | openssl enc base d encode me SSL客户端和服务器的测试 使用私钥和证书启动SSL服务器 " ”的作用是 当客户端连接服务器时 发送一个状态信息网页到客户端
  openssl s_server key mykey pem cert mycert pem 连接SSL服务器到 客户端会获得服务器的证书:
lishixinzhi/Article/program/PHP/201311/20914

openssl 证书 及ssh密匙

公钥和私钥都可以用来加密数据,相反用另一个解开。
公钥加密数据,然后私钥解密的情况被称为 加密解密。
私钥加密数据,公钥解密一般被称为 签名和验证签名。

RSA/DSA

一般的公钥不会用明文传输给别人的,正常情况下都会生成一个文件,这个文件就是公钥文件,然后这个文件可以交给其他人用于加密,但是传输过程中如果有人恶意破坏,将你的公钥换成了他的公钥,然后得到公钥的一方加密数据,不是他就可以用他自己的密钥解密看到数据了吗,为了解决这个问题,需要一个公证方来做这个事,任何人都可以找它来确认公钥是谁发的.这就是CA,CA确认公钥的原理也很简单,它将它自己的公钥发布给所有人,然后一个想要发布自己公钥的人可以将自己的公钥和一些身份信息发给CA,CA用自己的密钥进行加密,这里也可以称为签名.然后这个包含了你的公钥和你的信息的文件就可以称为证书文件了.这样一来所有得到一些公钥文件的人,通过CA的公钥解密了文件,如果正常解密那么机密后里面的信息一定是真的,因为加密方只可能是CA,其他人没它的密钥啊.这样你解开公钥文件,看看里面的信息就知道这个是不是那个你需要用来加密的公钥了.

密钥文件的格式用OpenSSL生成的就只有PEM和DER两种格式,
PEM的是将密钥用base64编码表示出来的,直接打开你能看到一串的英文字母
DER格式是二进制的密钥文件

参考: 网址

不区分环境,使用以下命令生成新的ssh key:

选择生成文件以及key密码之后,会生成两个文件,其中已 pub 为后缀的为共钥

SSH默认位置为:
Windows命令提示符:

Windows / GNU / Linux / macOS / PowerShell上的Git Bash:

参考: gitlab.com

如何用C语言来使用openssl rsa进行公钥加密,已有公钥和明文

1. 本程序使用2048位密钥对,每次加密时,原始数据的最大长度为245字节,加密后的密文长度为256字节.(采用打PADDING 的加密方式)
2. 如果所加密数据长度大于245字节,请分多次加密,后将密文按顺序存储;解密时,每次读取256字节,进行解密,将解密后的数据依次按顺序存储,即可还原原始数据.
#include

#include

#include

#include

#include

#include

#include

#define OPENSSLKEY "test.key"

#define PUBLICKEY "test_pub.key"

#define BUFFSIZE 1024

char *my_encrypt(char *str, char *path_key); //加密

char *my_decrypt(char *str, char *path_key); //解密

int main(void)

{

char *source = "i like dancing !!!";

char *ptf_en, *ptf_de;

printf("source is :%s\n", source);

//1.加密

ptf_en = my_encrypt(source, PUBLICKEY);

if (ptf_en == NULL){

return 0;

}else{

printf("ptf_en is :%s\n", ptf_en);

}

//2.解密

ptf_de = my_decrypt(ptf_en, OPENSSLKEY);

if (ptf_de == NULL){

return 0;

}else{

printf("ptf_de is :%s\n", ptf_de);

}

if(ptf_en) free(ptf_en);

if(ptf_de) free(ptf_de);

return 0;

}

//加密

char *my_encrypt(char *str, char *path_key)

{

char *p_en = NULL;

RSA *p_rsa = NULL;

FILE *file = NULL;

int lenth = 0; //flen为源文件长度, rsa_len为秘钥长度

//1.打开秘钥文件

if((file = fopen(path_key, "rb")) == NULL)

{

perror("fopen() error 111111111 ");

goto End;

}

//2.从公钥中获取 加密的秘钥

if((p_rsa = PEM_read_RSA_PUBKEY(file, NULL,NULL,NULL )) == NULL)

{

ERR_print_errors_fp(stdout);

goto End;

}

lenth = strlen(str);

p_en = (char *)malloc(256);

if(!p_en)

{

perror("malloc() error 2222222222");

goto End;

}

memset(p_en, 0, 256);

//5.对内容进行加密

if(RSA_public_encrypt(lenth, (unsigned char*)str, (unsigned char*)p_en, p_rsa, RSA_PKCS1_PADDING) < 0)

{

perror("RSA_public_encrypt() error 2222222222");

goto End;

}

End:

//6.释放秘钥空间, 关闭文件

if(p_rsa) RSA_free(p_rsa);

if(file) fclose(file);

return p_en;

}

//解密

char *my_decrypt(char *str, char *path_key)

{

char *p_de = NULL;

RSA *p_rsa = NULL;

FILE *file = NULL;

//1.打开秘钥文件

file = fopen(path_key, "rb");

if(!file)

{

perror("fopen() error 22222222222");

goto End;

}

//2.从私钥中获取 解密的秘钥

if((p_rsa = PEM_read_RSAPrivateKey(file, NULL,NULL,NULL )) == NULL)

{

ERR_print_errors_fp(stdout);

goto End;

}

p_de = (char *)malloc(245);

if(!p_de)

{

perror("malloc() error ");

goto End;

}

memset(p_de, 0, 245);

//5.对内容进行加密

if(RSA_private_decrypt(256, (unsigned char*)str, (unsigned char*)p_de, p_rsa, RSA_PKCS1_PADDING) < 0)

{

perror("RSA_public_encrypt() error ");

goto End;

}

End:

//6.释放秘钥空间, 关闭文件

if(p_rsa) RSA_free(p_rsa);

if(file) fclose(file);

return p_de;

}

阅读更多 >>>  为什么安装软件好小

命令行的压缩解压缩以及加密解密

zip -e aa.zip aa.log

zip -er aa.zip tmp

unzip aa.zip

unzip -P passwork filename.zip? ##passwork是要解压的密码,这个不会有提示输入密码的操作

unzip aa.zip

unzip -P passwork filename.zip? ##passwork是要解压的密码,这个不会有提示输入密码的操作

tar-czvf?/path/to/aa.tar.gz?/path/to/aa.log

???????tar? -xzvf? /path/to/aa.tar.gz /path/to/

?tar -czvf-file tmp | openssl des3 -salt -k 123456 -out aa.tar.gz

?openssldes3 -d -k 123456 -salt -in aa.tar.gz | tar xzf -

openssl enc -aes-128-cbc

-in install.log -out enc.log

(注:这里install.log是你想要加密的文件,enc.log是加密后的文件,回车后系统会提示你输入密码。)

openssl enc -d -aes-128-cbc -in enc.log -out install.log

(注:enc.log是刚才加密的文件,install.log是解密后的文件,-d选项实现解密功能。)

openssl enc -aes-128-cbc -in install.log -out enc.log -a

openssl enc -des-ede3-cbc -in install.log -out enc.log -pass pass:111111

1、openssl genrsa -out client.key 2048??????? #生成私钥

2、openssl rsa -in client.key -pubout -out pub.key?? #从密钥文件中提取公钥

3、openssl rsautl -encrypt -inkey pub.key -pubin -in data.zip -out back.zip。 #利用公钥进行加密;

4、openssl rsautl -decrypt -inkey rsa.key -in back.zip -out data.zip.???????#利用私钥对文件进行解密;

可能会报错:

RSA operation error:

3020:error:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too largefor key size:.\crypto\rsa\rsa_pk1.c:151:

利用smile进行操作:

加密:

openssl? smime? -encrypt -aes256? -in?in.zip? -binary? -outform DEM?-out? in_encrypted.zip? publickey.pem

解密:

openssl?smime -decrypt? -in? in_encrypted.zip? -binary-inform DEM -inkey privatekey.pem? -out in.zip

如何利用OpenSSL库进行RSA加密和解密

#include

#include

#include

#include

#include

int main(int argc, char* argv[]){ printf("openssl_test begin\n"); RSA* rsa=NULL; char originstr[]="hello\n"; //这是我们需要加密的原始数据 //allocate RSA structure,首先需要申请一个RSA结构题用于存放生成的公私钥,这里rsa就是这个结构体的指针 rsa = RSA_new(); if(rsa==NULL) { printf("RSA_new failed\n"); return -1; } //generate RSA keys BIGNUM* exponent; exponent = BN_new(); //生成RSA公私钥之前需要选择一个奇数(odd number)来用于生成公私钥 if(exponent ==NULL) { printf("BN_new failed\n"); goto FAIL1; } if(0==BN_set_word(exponent,65537)) //这里选择奇数65537 { printf("BN_set_word failed\n"); goto FAIL1; } //这里modulus的长度选择4096,小于1024的modulus长度都是不安全的,容易被破解 if(0==RSA_generate_key_ex(rsa,4096,exponent,NULL)) { printf("RSA_generate_key_ex failed\n"); goto FAIL; } char* cipherstr = NULL; //分配一段空间用于存储加密后的数据,这个空间的大小由RSA_size函数根据rsa算出 cipherstr = malloc(RSA_size(rsa)); if(cipherstr==NULL) { printf("malloc cipherstr buf failed\n"); goto FAIL1; } //下面是实际的加密过程,最后一个参数padding type,有以下几种。 /*RSA_PKCS1_PADDINGPKCS #1 v1.5 padding. This currently is the most widely used mode.RSA_PKCS1_OAEP_PADDINGEME-OAEP as defined in PKCS #1 v2.0 with SHA-1, MGF1 and an empty encoding parameter. This mode is recommended for all new applications.RSA_SSLV23_PADDINGPKCS #1 v1.5 padding with an SSL-specific modification that denotes that the server is SSL3 capable.RSA_NO_PADDINGRaw RSA encryption. This mode should only be used to implement cryptographically sound padding modes in the application code. Encrypting user data directly with RSA is insecure.*/ //这里首先用公钥进行加密,选择了RSA_PKCS1_PADDING if(RSA_size(rsa)!=RSA_public_encrypt(strlen(originstr)+1,originstr,cipherstr,rsa,RSA_PKCS1_PADDING)) { printf("encryption failure\n"); goto FAIL2; } printf("the original string is %s\n",originstr); printf("the encrypted string is %s\n",cipherstr); //Now, let's decrypt the string with private key //下面来用私钥解密,首先需要一个buffer用于存储解密后的数据,这个buffer的长度要足够(小于RSA_size(rsa)) //这里分配一个长度为250的字符数组,应该是够用的。 char decrypted_str[250]; int decrypted_len; if(-1=(decrypted_len=RSA_private_decrypt(256,cipherstr,decrypted_str,rsa,RSA_PKCS1_PADDING))) { printf("decryption failure\n"); goto FAIL2; } printf("decrypted string length is %d,decryped_str is %s\n",decrypted_len,decrypted_str);FAIL2: free(cipherstr);FAIL1: BN_free(exponent);FAIL: RSA_free(rsa); return 0;}以上是源代码,下面使用下面的编译命令在源码所在路径下生成可执行文件 gcc *.c -o openssl_test -lcrypto -ldl -L/usr/local/ssl/lib -I/usr/local/ssl/include其中,-lcrypto和-ldl是必须的,前者是OpenSSL中的加密算法库,后者是用于成功加载动态库。

阅读更多 >>>  借钱软件为什么都要交钱

OpenSSL 功能介绍

1 概述

OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。

OpenSSL是实现安全套接字层(SSL v2 / v3)和传输层安全(TLS v1)网络协议及其所需的相关加密标准的加密工具包。

OpenSSL:开源项目

三个组件:

openssl: 多用途的命令行工具,包openssl

libcrypto: 加密算法库,包openssl-libs

libssl:加密模块应用库,实现了ssl及tls,包nss

.openssl命令:

两种运行模式:交互模式和批处理模式

opensslversion:程序版本号

标准命令、消息摘要命令、加密命令

标准命令:enc, ca, req, ...

查看帮助:openssl ?

可以通过openssl 来创建CA和颁发证书,文章 http://ghbsunny.blog.51cto.com/7759574/1964754

有做介绍,本文仅介绍openssl这个工具包的其他常用功能

2 案例介绍

2.1 对称加密

工具:openssl ?enc, gpg,文章 http://ghbsunny.blog.51cto.com/7759574/1964887 已经介绍

算法:3des, aes, blowfish, twofish

.enc命令:

对称密码命令允许使用基于密码或明确提供的密钥的各种块和流密码来加密或解密数据。 Base64编码或解码也可以通过本身或加密或解密来执行。

The symmetric cipher commands allow data to be encrypted or decrypted using various block and stream ciphers using keys based on passwords or explicitly provided. Base64 encoding or decoding can also be performed either by itself or in addition to the encryption or decryption.

帮助:man enc

例子

加密文件

以下命令运行需要输入一个密码,当解密的时候需要输入相同的密码才能解密,这里新生成的文件后缀名不一定是cipher,可以自己指定

openssl enc ?-e -des3 -a -salt -in testfile ? -out testfile.cipher

解密文件

openssl ?enc ? -d -des3 -a -salt –in testfile.cipher -out testfile

2.2 公钥加密

公钥加密生成非对称的密钥

算法:RSA, ELGamal

工具:gpg, openssl ?rsautl(man rsautl)

数字签名:

算法:RSA, DSA, ELGamal

密钥交换:

算法:dh

DSA: Digital Signature Algorithm

DSS:Digital Signature Standard

RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。命名是取其名字首字母组合成RSA

RSA公钥与私钥主要用于数字签名(Digital Signature)与认证(Authentication),我们一般也称之为不对称加密/解密。

2.2.1 生成密钥对

帮助:man genrsa

.生成私钥,这个生成密钥的过程要掌握

openssl genrsa ?-out /PATH/TO/PRIVATEKEY.FILE NUM_BITS

私钥文件生成后,建议把权限改成600,保护,放在被其他人查看密码信息

私钥里的文件,如果被拿到,没有通过des这关键字加密的话,就相当于是明文

这个命令执行的时候,要输入八位数的密码,当要使用这个私钥的时候需要输入密码

(umask 077; openssl genrsa –out test.key ?–des 2048)

括号表示子进程,结束后,umask就会恢复未默认的值,umask的值使得其他人和组都没有任何权限,是为了保护生成的私钥

2.2.2 从私钥中提取出公钥,导出公钥

公钥推不出私钥,私钥可以推出公钥

openssl ?rsa ?-in PRIVATEKEYFILE –pubout ?–out PUBLICKEYFILE

Openssl ?rsa ?–in test.key ?–pubout ?–out test.key.pub

公钥是公开的,可以不设置权限,以上是生成公钥

2.2.3 公钥加密文件

openssl rsautl -encrypt -in input.file -inkey pubkey.pem -pubin -out output.file

-in 指定被加密的文件

-inkey 指定加密公钥文件

-pubin 表面是用纯公钥文件加密

-out 指定加密后的文件

例子:

openssl rsautl -encrypt -in ftpback -inkey test.key.pub -pubin -out ftpssl

2.2.4 私钥解密文件

openssl rsautl -decrypt -in input.file -inkey key.pem -out output.file

-in 指定需要解密的文件

-inkey 指定私钥文件

-out 指定解密后的文件

例子:

openssl rsautl -decrypt -in ftpssl -inkey test.key -out ?ftpdec

2.3 单向加密

单向加密即获取摘要

工具:md5sum, sha1sum, sha224sum,sha256sum…

openssl ? ?dgst

dgst:摘要功能输出所提供文件的消息摘要或十六进制形式的文件。 它们也可用于数字签名和验证。

The digest functions output the message digest of a supplied file or files in hexadecimal form. They can also be used for digital signing and verification.

.dgst命令:

帮助:man dgst

openssl ?dgst ?-md5 [-hex默认] ?/PATH/SOMEFILE

openssl dgst ?-md5 testfile

以上命令将文件生成一个固定长度的摘要值,算法是md5,大小占128bite

md5sum /PATH/TO/SOMEFILE

以上这两个md5得到的结果是一样的

.MAC: Message Authentication Code,单向加密(hash)的一种延伸应用,用于实现网络通信中保证所传输数据的完整性机制

MAC 消息认证码,构造方法可以基于hash,也可以基于对称加密算法,HMAC是基于hash的消息认证码。数据和密钥作为输入,摘要信息作为输出,常用于认证。

源文档

2.4 生成用户密码

passwd命令:

帮助:man sslpasswd

openssl ?passwd ?-1 -salt SALT

-1对应的就是hash的md5算法

SALT:这里是盐值,人为指定,使得同一密码生成的加密值不一样,最多8位,超过8位没有意义,比如前面8位一样,后面还有几位数不一样,这样生成的密码值是一样的

openssl ?passwd ?-1 –salt centos

grub-md5-crypt同样生成md5加密的口令,centos为盐值

比如这里的密码我都是输入123,但是盐值不一样,一个是centos,一个是centos6,生成的加密值不一样

2.5 生成随机数

帮助:man sslrand

rand命令在播放随机数生成器一次后输出num伪随机字节。 与其他openssl命令行工具一样,除了-rand选项中给出的文件外,PRNG种子使用文件$ HOME / .rnd或.rnd。 如果从这些来源获得足够的播种,将会写回新的$ HOME / .rnd或.rnd文件。

The rand command outputs num pseudo-random bytes after seeding the random number generator once. ?As in other openssl command line tools, PRNG seeding uses the file $HOME/.rnd or .rnd in addition to the files given in the ?-rand option. ?A new $HOME/.rnd or .rnd file will be written back if enough seeding was obtained from these ? sources.

openssl ?rand -base64|-hex NUM

指定数字生成随机数,如果是-hex 后面的数值比如6,那么生成的长度是12位,因为hex生成的随机数是16进制组合的数,hex 后面的num是字节数,一个16进制数占用4位,半个字节

base后面可以生成随机密码

base64 生成随机的数,可以用任何字符,也可以把图片保存成base64的格式,通过base64生成的图片,可以

用base64来还原出图片

NUM: 表示字节数;-hex时,每个字符为十六进制,相当于4位二进制,出现的字符数为NUM*2

3 总结

openssl还有很多用法,本文仅单纯介绍了其中一部分,更多用法请使用帮助 man openssl 进行查看

OpenSSL之EVP用法

OpenSSL EVP(high-level cryptographic functions)提供了丰富的密码学中的各种函数。OpenSSL中实现了各种对称算法、摘要算法以及签名/验签算法。EVP函数将这些具体的算法进行了封装。 EVP主要封装了如下功能函数: 1)实现了BASE64编解码BIO; 2)实现了加解密BIO; 3)实现了摘要BIO; 4)实现了reliable BIO; 5)封装了摘要算法; 6)封装了对称加解密算法; 7)封装了非对称密钥的加密(公钥)、解密(私钥)、签名与验证以及辅助函数; 8)基于口令的加密(PBE); 9)对称密钥处理; 10)数字信封:数字信封用对方的公钥加密对称密钥,数据则用此对称密钥加密。发送给对方时,同时发送对称密钥密文和数据密文。接收方首先用自己的私钥解密密钥密文,得到对称密钥,然后用它解密数据。 11)其他辅助函数。
本文假设你已经安装好了OpenSSL,并且持有一份1.1.1的源码。 EVP相关的头文件在evp.h中、源文件在crypto/evp目录中。 由于EVP的功能过于强大,再加上我的精力和水平有限,暂时只对部分功能进行摘录和说明。
这个结构定义了摘要算法的抽象方法。主要字段含义: type —— 摘要算法的NID。 pkey_type —— 与摘要算法相关的密钥NID。 md_size —— 摘要值的输出大小。 flags —— 内部标志。 init —— 初使化函数。 update —— 输入计算函数。 final —— 输出计算函数。 copy —— 摘要运算上下文复制函数。 cleanup —— 摘要运算上下文清理函数。 block_size —— 摘要运算分组大小。 ctx_size —— 摘要运算分组缓冲区大小。 md_ctrl —— 摘要运算指令控制函数。
支持的摘要算法包括: const EVP_MD *EVP_md5(void); const EVP_MD *EVP_sha1(void); const EVP_MD *EVP_sha256(void); const EVP_MD *EVP_sha512(void);
拿EVP_md5()来说,其返回值为:
下面这几个函数查询md的属性信息:
有时我们对使用的摘要算法不熟悉,这几个函数很有帮助。
EVP_MD_CTX *EVP_MD_CTX_new(void); void EVP_MD_CTX_free(EVP_MD_CTX *ctx); 这两个函数用于创建和释放对称摘要上下文对象。
int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type); 初使化摘要上下文,type为摘要算法抽象集合。 成功返回1,失败返回0。
int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *d, size_t cnt); 向摘要计算的海棉结构输入一段数据。 成功返回1,失败返回0。
int EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s); 生成最终摘要,输出摘要值和长度。 成功返回1,失败返回0。
int EVP_Digest(const void *data, size_t count, unsigned char *md, unsigned int *size, const EVP_MD *type, ENGINE *impl); 使用包装的一次性方法计算一段小数据的摘要。 成功返回1,失败返回0。
struct evp_cipher_st { int nid; int block_size; /* Default value for variable length ciphers / int key_len; int iv_len; / Various flags / unsigned long flags; / init key / int ( init) (EVP_CIPHER_CTX *ctx, const unsigned char *key, const unsigned char iv, int enc); / encrypt/decrypt data / int ( do_cipher) (EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char in, size_t inl); / cleanup ctx / int ( cleanup) (EVP_CIPHER_CTX ); / how big ctx->cipher_data needs to be / int ctx_size; / Populate a ASN1_TYPE with parameters / int ( set_asn1_parameters) (EVP_CIPHER_CTX *, ASN1_TYPE ); / Get parameters from a ASN1_TYPE / int ( get_asn1_parameters) (EVP_CIPHER_CTX *, ASN1_TYPE ); / Miscellaneous operations / int ( ctrl) (EVP_CIPHER_CTX *, int type, int arg, void ptr); / Application data */ void app_data; } / EVP_CIPHER */ ; typedef struct evp_cipher_st EVP_CIPHER; 这个结构定义了对称加密算法的抽象方法。主要字段含义: nid —— 加密算法的NID。 block_size —— 分组大小。 key_len —— 密钥长度。 iv_len —— 初使向量长度。 flags —— 内部标志。 init —— 初使化函数。 do_cipher —— 中间运算函数。 cleanup —— 最终运算函数。 ctx_size —— 上下文大小。 ctrl —— 控制函数。 app_data —— 应用程序数据。
支持的CIPHER抽象加解密算法包括: const EVP_CIPHER *EVP_des_ecb(void); const EVP_CIPHER *EVP_des_ede3(void); const EVP_CIPHER *EVP_aes_128_ecb(void); const EVP_CIPHER *EVP_aes_128_cbc(void);
下面这几个函数查询cipher的属性信息: int EVP_CIPHER_nid(const EVP_CIPHER *cipher); int EVP_CIPHER_type(const EVP_CIPHER *ctx); # define EVP_CIPHER_name(e) OBJ_nid2sn(EVP_CIPHER_nid(e)) int EVP_CIPHER_block_size(const EVP_CIPHER *cipher); int EVP_CIPHER_key_length(const EVP_CIPHER *cipher); int EVP_CIPHER_iv_length(const EVP_CIPHER *cipher); 有时我们对使用的加密算法不熟悉,这几个函数很有帮助。
EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void); void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *c); 这两个函数用于创建和释放对称加解密上下文对象。
int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *x, int keylen); 当对称算法密钥长度为可变长时,设置对称算法的密钥长度。 成功返回1,失败返回0。
int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *c, int pad); 设置对称算法的填充,对称算法有时候会涉及填充。 pad取值0和1,当pad为1时表示使用填充。默认的填充策略采用PKCS5规范,即最后一个分组被填充n个字节时,其填充值均为n。 成功返回1,失败返回0。
int EVP_EncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, const unsigned char *key, const unsigned char *iv); 初使化对称加密上下文。 成功返加1,失败返回0。
int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, const unsigned char *in, int inl); 加密一段明文。 成功返加1,失败返回0。成功时,outl输出密文长度。
int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); 加密余下的明文。 成功返加1,失败返回0。成功时,outl输出密文长度。
int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, const unsigned char *key, const unsigned char *iv); 初使化对称解密上下文。 成功返加1,失败返回0。
int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, const unsigned char *in, int inl); 解密一段密文。 成功返加1,失败返回0。成功时,outl输出明文长度。
int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl); 解密余下的密文。 成功返加1,失败返回0。成功时,outl输出明文长度。
int EVP_BytesToKey(const EVP_CIPHER *type, const EVP_MD *md, const unsigned char *salt, const unsigned char *data, int datal, int count, unsigned char *key, unsigned char *iv); 计算密钥函数,它根据算法类型、摘要算法、salt以及输入数据计算出一个对称密钥和初始化向量iv。返加密钥的长度。 在PEM_do_header()函数中根据口令生成密钥时,有使用到这个函数。
这个结构定义了非对称密钥信息的存储容器。主要字段含义: type —— 非对称加密算法的NID。 save_type —— 保存的PKEY类型。 pkey —— 保存的PKEY指针,如RSA结构指针。
EVP_PKEY *EVP_PKEY_new(void); void EVP_PKEY_free(EVP_PKEY *pkey); 这两个函数用于创建和释放PKEY上下文对象。
int EVP_PKEY_assign(EVP_PKEY *pkey, int type, void *key); 为PKEY关联指定算法类型的上下文结构,如为RSA关联的宏定义如下:
# define EVP_SignInit(a,b) EVP_DigestInit(a,b) # define EVP_SignUpdate(a,b,c) EVP_DigestUpdate(a,b,c) int EVP_SignFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s, EVP_PKEY *pkey); 签名计算。从宏定义可以看出实际上就是先计算摘要,再用RSA私钥加密。 成功返加1,失败返回0。
# define EVP_VerifyInit(a,b) EVP_DigestInit(a,b) # define EVP_VerifyUpdate(a,b,c) EVP_DigestUpdate(a,b,c) int EVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf, unsigned int siglen, EVP_PKEY *pkey); 验签计算。从宏定义可以看出实际上就是先计算摘要,再用RSA公钥解密签名,再与摘要进行比对。 成功返加1,失败返回0。
下面这个例子演示了使用MD5的两种方法进行摘要计算的过程。
输出: EVP_DigestInit() ret:[1] EVP_DigestUpdate() ret:[1] EVP_DigestFinal() ret:[1] e380e88e8d09ebf8d8659a15b0ea70b5 EVP_Digest() ret:1 e380e88e8d09ebf8d8659a15b0ea70b5
下面这个例子演示了使用DES进行加解密的过程。为了方便程序实现,破例使用了std::string。
输出: EVP_EncryptInit() ret:[1] EVP_EncryptUpdate() ret:[1] nCipherLen:[24] EVP_EncryptFinal() ret:[1] nCipherLen:[8] cipher size:[32] EVP_DecryptInit() ret:[1] EVP_DecryptUpdate() ret:[1] nTextLen:[24] EVP_DecryptFinal() ret:[1] nTextLen:[2] text size:[26] body:[abcdefghijklmnopqrstuvwxyz]
下面这个例子演示了使用SHA1进行RSA签名和验签计算的过程。
输出: RSA_generate_key_ex() ret:[1] EVP_PKEY_assign_RSA() ret:[1] EVP_SignInit() ret:[1] EVP_SignUpdate() ret:[1] EVP_SignFinal() ret:[1] sha1 len:[64] EVP_VerifyInit() ret:[1] EVP_VerifyUpdate() ret:[1] EVP_VerifyFinal() ret:[1]

阅读更多 >>>  软件足彩为什么停售

openssl 加密算法区别

openssl加密算法区别是:RSA/DSA ,不同的是RSA可以用于加/解密,也可以用于签名验签,DSA则只能用于签名。至于SHA则是一种和md5相同的算法。
它不是用于加密解密或者签名的,它被称为摘要算法。就是通过一种算法,依据数据内容生成一种固定长度的摘要,这串摘要值与原数据存在对应关系,就是原数据会生成这个摘要,但是,这个摘要是不能还原成原数据的。
正常情况下是这样的,这个算法起的作用就是,如果你把原数据修改一点点,那么生成的摘要都会不同,传输过程中把原数据给你再给你一个摘要,你把得到的原数据同样做一次摘要算法,与给你的摘要相比较就可以知道这个数据有没有在传输过程中被修改了。
openssl加密算法的实际运用:
实际应用过程中,因为需要加密的数据可能会很大,进行加密费时费力,所以一般都会把原数据先进行摘要,然后对这个摘要值进行加密,将原数据的明文和加密后的。
摘要值一起传给你。这样你解开加密后的摘要值,再和你得到的数据进行的摘要值对应一下就可以知道数据有没有被修改了。
而且,因为私钥只有你有,只有你能解密摘要值,所以别人就算把原数据做了修改,然后生成一个假的摘要给你也是不行的,你这边用密钥也根本解不开。

网站数据信息

"openssl加密文件,如何用C语言来使用openssl rsa进行公钥加密,已有公钥和明文"浏览人数已经达到22次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:openssl加密文件,如何用C语言来使用openssl rsa进行公钥加密,已有公钥和明文的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!