上一节【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的更多相关文章

  1. openssl 学习之从证书中提取RSA公钥N 和 E

    原文链接: http://blog.csdn.net/kkxgx/article/details/19850509 通常数字证书包含很多信息,其中N和E值即我们称为的公钥.如何从PEM 或者DER格式 ...

  2. OPENSSL 学习整理-介绍

    Openssl目录名以及功能描述 目录名 功能描述 Crypto 存放OpenSSL 所有加密算法源码文件和相关标注如X.509 源码文件,是OpenSSL中最重要的目录,包含了OpenSSL 密码算 ...

  3. OpenSSL学习笔记

    SSL缺省只进行server端的认证,客户端的认证是可选的.以下是其流程图(摘自TLS协议). 加密算法介绍: 对称加密: DES:date encrption standard,56bit 3DES ...

  4. LINUX - openssl学习

    参考链接: https://www.cnblogs.com/AloneSword/p/4656492.html

  5. openssl_final学习总结

    openssl学习总结 openssl知识点总结 openssl实践总结 简介 openssl是一个功能丰富且自包含的开源安全工具箱.它提供的主要功能有: SSL协议实现(包括SSLv2.SSLv3和 ...

  6. openSSL命令、PKI、CA、SSL证书原理

    相关学习资料 http://baike.baidu.com/view/7615.htm?fr=aladdin http://www.ibm.com/developerworks/cn/security ...

  7. CCM加密学习

    这几天终于搞定了AES硬件加密工具的使用,几种简单的加密模式也都实验通过了,比较麻烦的一种是CCM模式的加密,它是CTR加密模式和CMAC认证算法的混合使用.本文先介绍CCM模式的原理与基本实现,然后 ...

  8. 2018-2019-1-20165221&20165225 《信息安全系统设计》实验五:通讯协议设计

    2018-2019-1-20165221&20165225 <信息安全系统设计>-实验五:通讯协议设计 OpenSSL学习: 简介: OpenSSL是为网络通信提供安全及数据完整性 ...

  9. OPENSSL编程入门学习

    相关学习资料 http://bbs.pediy.com/showthread.php?t=92649 https://www.openssl.org https://www.google.com.hk ...

  10. Chapter 2. OpenSSL的安装和配置学习笔记

    Chapter 2. OpenSSL的安装和配置学习笔记 2.1 在linux上面安装OpenSSL我还是做点No paper事情比较在行,正好和老师的课程接轨一下.以前尝试过在Windows上面安装 ...

随机推荐

  1. 关闭 Chrome 浏览器 更新错误 弹窗

    1 Chrome使用一段时间后,右上角总会弹出弹窗,并且影响鼠标聚焦,如下图: 2 解决方式: 右键点击 桌面Chrome图表,然后点击属性,按照下图操作: 在 快捷方式--目标 后输入:  --di ...

  2. WIN10 SERVICES -- 部署IIS

    一 . 添加角色功能 二. 添加WEB服务器(IIS) 三. 打开TCP ASP.NET 安装 供运行端口

  3. Linux系统搭建性能测试监控体系

    一.安装Grafana 1.Grafana介绍(默认端口3000): Grafana是一个开源的监控和可视化工具,用于显示和跟踪各种指标,数据和日志,支持多种源,包括influxDB.promethe ...

  4. WebLogic XMLDecoder反序列化漏洞

    目录 前言 XMLDecoder概述 XMLDecoder反序列化漏洞 漏洞复现 前言 上篇复现了T3反序列化漏洞,XMLDecoder反序列化在WebLogic中也是一类影响很大的反序化漏洞. XM ...

  5. BI系统汇总

    datart datart (数艺)是面向业务人员.数据工程师.数据分析师.数据科学家,致力于提供一站式数据可视化解决方案.既可以作为公 有云 / 私有云部署使用,也可作为可视化插件集成到三方系统.用 ...

  6. Linux之命令提示神器tldr

    github:tldr-pages/tldr: Collaborative cheatsheets for console commands (github.com) 一款很好用的命令帮助工具, 之前 ...

  7. 【java基础】-- java接口和抽象类的异同分析

    在java中,通常初学者搞不懂接口与抽象类,这也是面试比较容易问到的一个问题.下面我来谈谈自己的理解.如有不妥之处,还望批评指正,不胜感激. 目录 1.抽象类怎么定义和继承? 2.接口怎么定义和实现? ...

  8. 1分钟学会如何提升PCIe通信速率,基于RK3568J + FPGA国产平台!

    测试数据汇总 表 1 PCIe总线介绍 PCIe,即PCI-Express(peripheral component interconnect express)是一种高速串行计算机扩展总线标准.主要用 ...

  9. Node.js Express 框架(2)

    1.读取文件并返回给客户端 res.sendFile(path):读取文件并返回给客户端,适合静态页面 app.get("/",function(req,res){ res.sen ...

  10. 李世铭SFE|销售的四种境界-与之匹配的CRM功能

    销售有四种境界,与之匹配的也应有四种不同的CRM系统的功能. 1.服务型销售 这类销售代表人数最为众多,超过半数的销售代表皆属于服务型.他们主要基于客户的需求,来提供相应的解决方案,或者公司所规定的某 ...