openSSL学习-1
上一节【openSSL学习-0】了解openSSL和安装,本节以des.h为例,学习DES分组密码算法
DES
加密分组
- 调用函数,实现一个分组的加解密(DES-ECB模式)
#include <iostream>
#include "openssl/des.h"
using namespace std;
/*
* DES-ECB模式加解密测试
*/
int main() {
//明文
unsigned char data[]="1234567";
//密钥
unsigned char key[]="abcdefg";
//密文
unsigned char cip[]={0};
//输出
unsigned char out[]={0};
DES_key_schedule key_sch; //实际存储密钥
//密钥生成
DES_set_key((const_DES_cblock*)&key,&key_sch);
//加密
DES_ecb_encrypt((const_DES_cblock*)&data,(DES_cblock*)&cip,&key_sch,DES_ENCRYPT);
cout << "密文:"<<cip<<endl;
//解密
DES_ecb_encrypt((const_DES_cblock*)&cip,(DES_cblock*)&out,&key_sch,DES_DECRYPT);
cout << "明文:" <<out<<endl;
return 0;
}

加密文件
- 使用命令:加解密文件
//
// Created by hang shao on 2022/10/12.
//
#include "iostream"
#include "openssl/des.h"
#include "fstream"
using namespace std;
int main(int argc,char* argv[])
{
string cmd="加密文件:crypt_file 输入文件名 输出文件名 密码(6位)\n";
cmd += "解密文件:crypt_file 输入文件名 输出文件名 密码(6位)-d\n";
cout << cmd<<endl;
//输入判定
if(argc<4)
{
cerr<<"输入错误!"<<endl;
return -1;
}
string in_file=argv[1]; //输入文件
string out_file=argv[2]; //输出文件
string password=argv[3]; //密钥
int is_encrypt=DES_ENCRYPT; //加密
if(argc>4)
{
is_encrypt=DES_DECRYPT;//解密
}
//二进制打开输入文件
ifstream ifs(in_file,ios ::binary);
if(!ifs)
{
cerr << "in_file:"<<in_file<<"打开失败!"<<endl;
return -1;
}
//二进制打开输出文件
ofstream ofs(out_file,ios ::binary);
if(!ofs)
{
ifs.close();
cerr << "out_file:"<<out_file<<"打开失败!"<<endl;
return -1;
}
//处理密钥,多出丢掉,少的补0
int key_size=password.size();
const_DES_cblock key={0};//少则补0
if(key_size > sizeof (key))
{
key_size=sizeof (key);//多出丢掉
}
memcpy(key,password.c_str(),key_size);
DES_key_schedule key_sch;
DES_set_key(&key,&key_sch);//设置密钥
const_DES_cblock in;//输入文件
DES_cblock out;//输出文件
//读文件-》加解密文件-》写入文件
while (!ifs.eof())
{
//读文件
ifs.read((char*)in,sizeof(in));
int count=ifs.gcount();
if(count<=0) break;
//加解密文件
DES_ecb_encrypt(&in,&out,&key_sch,is_encrypt);
//写入文件
ofs.write((char *)out,sizeof(out));
}
ifs.close();
ofs.close();
return 0;
}
输入命令:
./file_DES test.png cip.png 123456
./file_DES cip.png out.png 123456 -d
得到的文件:

问题:
这里加密后的密文文件多了6字节,解密后的文件也多了6字节。
优化
原因:
没有丢弃填充(加密时自动补充为8的倍数)的部分
解决方法:
加密前数据手动填充,解密后手动去除填充的部分
填充方法:

//
// Created by hang shao on 2022/10/12.
//
#include "iostream"
#include "openssl/des.h"
#include "fstream"
using namespace std;
int main(int argc,char* argv[])
{
string cmd="加密文件:crypt_file 输入文件名 输出文件名 密码(6位)\n";
cmd += "解密文件:crypt_file 输入文件名 输出文件名 密码(6位)-d\n";
cout << cmd<<endl;
//输入判定
if(argc<4)
{
cerr<<"输入错误!"<<endl;
return -1;
}
string in_file=argv[1]; //输入文件
string out_file=argv[2]; //输出文件
string password=argv[3]; //密钥
int is_encrypt=DES_ENCRYPT; //加密
if(argc>4)
{
is_encrypt=DES_DECRYPT;//解密
}
//二进制打开输入文件
ifstream ifs(in_file,ios ::binary);
if(!ifs)
{
cerr << "in_file:"<<in_file<<"打开失败!"<<endl;
return -1;
}
//二进制打开输出文件
ofstream ofs(out_file,ios ::binary);
if(!ofs)
{
ifs.close();
cerr << "out_file:"<<out_file<<"打开失败!"<<endl;
return -1;
}
//处理密钥,多出丢掉,少的补0
int key_size=password.size();
const_DES_cblock key={0};//少则补0
if(key_size > sizeof (key))
{
key_size=sizeof (key);//多出丢掉
}
memcpy(key,password.c_str(),key_size);
DES_key_schedule key_sch;
DES_set_key(&key,&key_sch);//设置密钥
const_DES_cblock in;//输入文件
DES_cblock out;//输出文件
//获取文件大小
long long filesize=0;
ifs.seekg(0,ios::end);//文件指针移到结尾
filesize=ifs.tellg();
ifs.seekg(0,ios::beg);//文件指针回到开始
cout <<"文件大小:"<<filesize<<endl;
long long read_size=0;
long long write_size=0;
//读文件-》加解密文件-》写入文件
while (!ifs.eof())
{
int out_len=sizeof (out);
//读文件
ifs.read((char*)in,sizeof(in));
int count=ifs.gcount();
if(count<=0) break;
read_size+=count;
//PKCS Padding 填充
//加密到结尾处,填充
if(read_size==filesize && is_encrypt==DES_ENCRYPT)
{
if(filesize%8==0) //填充8个字节的值为8
{
//先写入之前的数据
DES_ecb_encrypt(&in,&out,&key_sch,is_encrypt);
ofs.write((char *)out,out_len);
//填充数据8
memset(in,8,sizeof (in));
}else
{
int padding=8-(filesize%8);//要填充的字节
//移动位置,填充数据
memset(in+(filesize%8),padding,padding);
}
}
//加解密文件
DES_ecb_encrypt(&in,&out,&key_sch,is_encrypt);
//解密padding
if(read_size==filesize && is_encrypt==DES_DECRYPT)
{
//去除填充数据
out_len=8-out[7];
}
if(out_len<=0) break;
//写入文件
ofs.write((char *)out,out_len);
write_size+=out_len;
}
ifs.close();
ofs.close();
cout<<"写入大小:"<<write_size<<endl;
return 0;
}

openSSL学习-1的更多相关文章
- openssl 学习之从证书中提取RSA公钥N 和 E
原文链接: http://blog.csdn.net/kkxgx/article/details/19850509 通常数字证书包含很多信息,其中N和E值即我们称为的公钥.如何从PEM 或者DER格式 ...
- OPENSSL 学习整理-介绍
Openssl目录名以及功能描述 目录名 功能描述 Crypto 存放OpenSSL 所有加密算法源码文件和相关标注如X.509 源码文件,是OpenSSL中最重要的目录,包含了OpenSSL 密码算 ...
- OpenSSL学习笔记
SSL缺省只进行server端的认证,客户端的认证是可选的.以下是其流程图(摘自TLS协议). 加密算法介绍: 对称加密: DES:date encrption standard,56bit 3DES ...
- LINUX - openssl学习
参考链接: https://www.cnblogs.com/AloneSword/p/4656492.html
- openssl_final学习总结
openssl学习总结 openssl知识点总结 openssl实践总结 简介 openssl是一个功能丰富且自包含的开源安全工具箱.它提供的主要功能有: SSL协议实现(包括SSLv2.SSLv3和 ...
- openSSL命令、PKI、CA、SSL证书原理
相关学习资料 http://baike.baidu.com/view/7615.htm?fr=aladdin http://www.ibm.com/developerworks/cn/security ...
- CCM加密学习
这几天终于搞定了AES硬件加密工具的使用,几种简单的加密模式也都实验通过了,比较麻烦的一种是CCM模式的加密,它是CTR加密模式和CMAC认证算法的混合使用.本文先介绍CCM模式的原理与基本实现,然后 ...
- 2018-2019-1-20165221&20165225 《信息安全系统设计》实验五:通讯协议设计
2018-2019-1-20165221&20165225 <信息安全系统设计>-实验五:通讯协议设计 OpenSSL学习: 简介: OpenSSL是为网络通信提供安全及数据完整性 ...
- OPENSSL编程入门学习
相关学习资料 http://bbs.pediy.com/showthread.php?t=92649 https://www.openssl.org https://www.google.com.hk ...
- Chapter 2. OpenSSL的安装和配置学习笔记
Chapter 2. OpenSSL的安装和配置学习笔记 2.1 在linux上面安装OpenSSL我还是做点No paper事情比较在行,正好和老师的课程接轨一下.以前尝试过在Windows上面安装 ...
随机推荐
- AI翻唱神器,一键用你喜欢的歌手翻唱他人的曲目(附下载链接)
最近,"AI孙燕姿"翻唱众多明星的歌曲在各大网络平台上走红,其作品不仅累积上千万的播放量,在科技圈和音乐圈也都引发了热议,歌手孙燕姿在社交平台发文回应称:人类无法超越AI技术已指日 ...
- callable结合FutureTask的多线程使用(免打扰模式)
import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.ut ...
- golang之命令行工具Cobra
github地址: https://github.com/spf13/cobra [安装] go get -u github.com/spf13/cobra@latest 使用cobra_cli工具 ...
- go get 和 go install 对比
(一)命令定义和区别 go install 和 go get 都是 Go 语言的工具命令,但它们之间有一些区别. go get:用于从远程代码存储库(如 GitHub)中下载或更新 Go 代码包.它会 ...
- npm run build命令运行后报错 npm ERR! missing script: build
打开vue项目中的package.json查看一下script的设置,是否如下图 如果是的话,那么运行打包命令的时候要运行 npm run build:prod --report
- 同步工具之Vector
官网: https://vector.dev/ 用于构建可观察性管道的轻量级.超快速工具 [安装] curl --proto '=https' --tlsv1.2 -sSf https://sh.ve ...
- Phpstorm之快捷键
常用快捷键 1.ctrl+alt+s 快速打开setting系统设置 2.CTRL+/ 单行注释/取消注释 CTRL+SHIFT+/ 块状注释/取消块状注释 3.方法体上面打入'/**' 再按回车键 ...
- yum安装PHP,Redis,mysql,nginx
线上PHP环境的安装一般使用编译的方式,但是需要手动一个一个安装,这次使用yum来进行安装 一.PHP 1.安装EPEL源 rpm -ivh https://dl.fedoraproject.org/ ...
- 服务器间文件实时双向同步(rsync+inotify)
场景: 主从服务器项目文件实时双向同步(参考:http://www.xcx1024.com/ArtInfo/3026389.html) 一.rsync安装 yum在线: yum install -y ...
- 从零开始学java(第一天)
上班日学习时间很短,而且很多事情会耽搁,就会写的比较少 近几期的笔记以复习为主,后面会逐渐拓展对我个人来说的新知识 1. 复习了一下typore的语法,方便以后记笔记用 # MarkDown学习(# ...