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上面安装 ...
随机推荐
- 4G模组软件指南 | json数据处理深度学习篇
针对4G模组软件的json数据处理,我已做出如下示例分享给大家,以4G模组Air780E为例: 1.JSON介绍 JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式 ...
- element ui Tree树形控件获取未全选父节点和子节点id
Tree树形控件选中状态 在做分配权限的时候如图选择了父节点的某些子节点,现在父节点是半选中状态,使用this.$refs.tree.getCheckedKeys()只能拿到当前的子节点,子节点全选才 ...
- Java中的对象池模式
Java中的对象池模式 Java对象的生命周期分析: Java对象的生命周期大致包括三个阶段: 对象的创建,对象的使用, 对象的清除. 因此,对象的生命周期长度可用如下的表达式表示: T = T1 + ...
- springboot 前后端大打包成一个JAR
1.概述 现在开发使用前后端开发机制,在部署的时候,我们需要将前后端分别打包,使用nginx 进行统一部署.这样就比较复杂,我们可以使用前后端打包到一个jar中,这样我们只需要一个包就可以了. 2.实 ...
- 《前端运维》一、Linux基础--11服务
首先服务的概念,对于linux服务器来说,其中大多数的软件都算是服务,比如nginx.mysql.Jenkins等等.下面我们就来学习一下linux中有关服务的一些内容. 一.服务简介和分类 1.运行 ...
- QTabWidget的高度取决于当前选项卡的高度
QTabWidget的高度自适应当前选项卡的高度,可以通过设置其他选项卡的QSizePolicy为Ignored, connect(ui->tabWidget,SIGNAL(currentCha ...
- jedis使用及注意事项
参考: https://stackoverflow.com/questions/73242557/jedispool-vs-jedispooled https://redis.io/docs/late ...
- 【PHP】读取本地文件夹中所有图片并显示
<? //获取文件夹下的所有文件 $dir_str = ''; $imgType = array('gif','png','jpg','jpeg','bmp'); $handle = opend ...
- shell 下 exec,source,.,bash和sh以及export得区别
exec执行命令时,不会启用新的shell进程. source和 .也不会启用新的shell进程,在当前shell中执行,设定的局部变量在执行完命令后仍然有效. bash或sh执行时,会另起一个子 ...
- function keyword is non-standard. Delete it.
SC2112 – ShellCheck Wiki See this page on GitHub function keyword is non-standard. Delete it. Proble ...