上一节【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. 题解:CF507C Guess Your Way Out!

    CF507C Guess Your Way Out! 题解 算法 模拟 思路 按照左右左右的方式先往下找,每次找到一个子节点时就看此节点为根的子树是否包含目标节点,如果包含就继续往下走,不包含说明目标 ...

  2. Java深度历险(八)——Java I/O

    在应用程序中,通常会涉及到两种类型的计算:CPU计算和I/O计算.对于大多数应用来说,花费在等待I/O上的时间是占较大比重的.通常需要等待速度较慢的磁盘或是网络连接完成I/O请求,才能继续后面的CPU ...

  3. Windows系统下PhpStorm+Xdebug安装与调试

    环境说明: 系统:Windows10 PhpStorm:2019.3.2 PHP版本:7.3.21 Xdebug版本 :2.7.2 一.Xdebug介绍 官网地址:https://xdebug.org ...

  4. Vue第三方插件

    1.滚动条 vuescroll 引入插件 - 官网 <script src="https://unpkg.com/vuescroll"></script> ...

  5. js修改表单值不会触发input事件

    前情 最近在做需求开发时候,需要监听表单的input事件 坑位 当通过JS动态修改表单的值的发现并不会触发表单的input事件 Why? 个人猜测是浏览器默认行为,input只会针对用户手动输入做响应 ...

  6. Three.js案例-360全景房看

    在 360° 看房功能中,我们需要在浏览器中创建一个类似虚拟现实的场景,使得用户能够查看环境的每一个角落.这一功能的实现本质上是利用 球体映射技术,即通过将全景图作为纹理贴图映射到一个反向的球体上,用 ...

  7. Docker 使用 buildx 构建多种系统架构支持的镜像

    在 Docker 19.03+ 版本中可以使用 docker buildx build 命令使用 BuildKit 构建镜像.该命令支持 --platform 参数可以同时构建支持多种系统架构的 Do ...

  8. How To Install and Enable SSH Server on Debian 10

    https://devconnected.com/how-to-install-and-enable-ssh-server-on-debian-10/ How To Install and Enabl ...

  9. com.sun.xml.internal.messaging.saaj.util 不存在

    maven 编译时报错:程序包com.sun.xml.internal.messaging.saaj.util不存在需要添加 <compilerArguments> <verbose ...

  10. Centos yum命令提示failed to set locale, defaulting to C

    目录 问题 locale提示 解决方案 问题 在输入yum命令是出现 Failed to set locale, defaulting to C 1 出现这个问题是由于系统没有正确设置locale环境 ...