文档章节

C语言:基于OpenSSL-EVP实现DES对称加解密

ZZ-D-NEMO
 ZZ-D-NEMO
发布于 2017/03/27 20:47
字数 720
阅读 289
收藏 0

    关于DES对称加密算法以及OpenSSL EVP相关介绍在此不做展开,直接进入主题,本篇以DES_CBC加密算法为例,具体DEMO源码如下:

  • 示例代码:

****************************************************************************************

"des.c"

/* DES对称加解密 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/evp.h>
#include <openssl/err.h>

/* DES_CBC加密
 * 输入参数:key-密钥(8字节)|iv-算法向量(8字节)
 * 返回:成功则返回密文长度,失败则直接中断 */
static int encryptDes( unsigned char *key, unsigned char *iv,
    unsigned char *plain, unsigned char *cipher, int plen )
{
    int clen = 0;
    int tmplen = 0;
    EVP_CIPHER_CTX ctx;

    /* 01:加密初始化
     * 使用DES_CBC算法加密 */
    EVP_EncryptInit( &ctx, EVP_des_cbc(), key, iv );
    /* 设置不填充(缺省填充) */
    if( 0 == plen % 8 ){
        EVP_CIPHER_CTX_set_padding( &ctx, 0 );
    }

    /* 02:加密 */
    if( !EVP_EncryptUpdate( &ctx, cipher, &clen, plain, plen ) ){
        ERR_print_errors_fp( stderr );
        fprintf( stderr, "EVP_EncryptUpdate error\n" );
        return EXIT_FAILURE;
    }

    /* 03:加密后处理 */
    if( !EVP_EncryptFinal( &ctx, cipher + clen, &tmplen ) ){
        ERR_print_errors_fp( stderr );
        fprintf( stderr, "EVP_EncryptFinal error\n" );
        return EXIT_FAILURE;
    }
    clen += tmplen;

    return clen;
}

/* DES_CBC解密
 * 输入参数:key-密钥(8字节)|iv-算法向量(8字节)
 * 返回:成功则返回密文长度,失败则直接中断 */
static int decryptDes( unsigned char *key, unsigned char *iv,
    unsigned char *cipher, unsigned char *plain, int clen )
{
    int plen = 0;
    int tmplen = 0;
    EVP_CIPHER_CTX ctx;

    /* 01:解密初始化,算法向量缺省NULL
     * 使用DES_CBC算法解密 */
    EVP_DecryptInit( &ctx, EVP_des_cbc(), key, iv );

    /* 02:解密 */
    if( !EVP_DecryptUpdate( &ctx, plain, &plen, cipher, clen ) ){
        ERR_print_errors_fp( stderr );
        fprintf( stderr, "EVP_DecryptUpdate error\n" );
        return EXIT_FAILURE;
    }
    /* 设置不填充(缺省填充) */
    if( 0 == plen % 8 ){
        EVP_CIPHER_CTX_set_padding( &ctx, 0 );
        plen += 8;
    }

    /* 03:解密后处理 */
    if( !EVP_DecryptFinal( &ctx, plain + plen, &tmplen ) ){
        ERR_print_errors_fp( stderr );
        fprintf( stderr, "EVP_DecryptFinal error\n" );
        return EXIT_FAILURE;
    }
    plen += tmplen;

    return plen;
}

/* 测试程序
 * 目标:解密出的明文和最初的明文一致证明功能实现
 * 命令行参数:最初的明文 */
int main( int argc, char *argv[] )
{
    int i = 0;
    int plen = 0;
    int clen = 0;
    unsigned char key[] = "\x01\x02\x03\x04\x05\x06\x07\x08";
    unsigned char iv[] = "\x00\x00\x00\x00\x00\x00\x00\x00";
    unsigned char plain[1024 + 1] = {0};
    unsigned char cipher[1024 + 1] = {0};

    /* 依赖命令行参数输入 */
    if( 1 == argc ){
        fprintf( stderr, "Usage:[%s <buf>]\n", argv[0] );
        exit( EXIT_FAILURE );
    }

    printf( "【初始明文】[%s]\n", argv[1] );

    /* 01:公钥加密 */
    clen = encryptDes( key, iv, argv[1], cipher, strlen( argv[1] ) );
    /* LOOP:鉴于密文极有可能存在不可打印字符故而转十六进制输出 */
    printf( "【加密密文】[" );
    for( i = 0; i < clen; i ++ )
    {
        printf( "%02X", cipher[i] );
    }
    printf( "]\n" );

    /* 02:私钥解密 */
    plen = decryptDes( key, iv, cipher, plain, clen );
    printf( "【解密明文】[%s]\n", plain );

    exit( EXIT_SUCCESS );
}

****************************************************************************************

"Makefile"

#执行文件
bin=ides

#目标文件
objects=des.o

#连接规则
$(bin):$(objects)
 gcc -o ~/bin/$(bin) $(objects) -lssl -lcrypto -ldl

#清理对象
.PHONY:clean
clean:
 -rm ~/bin/$(bin) $(objects)

****************************************************************************************

  • 验证效果:

【P.S.】说明:

  1. 代码中标红部分是针对明文长度为8的整数倍时设置不填充所做的特殊处理,若不做此处理则加密后的密文会因为缺省填充处理比明文多8字节;
  2. 如果需要使用DES_ECB/DES_CFB/DES_OFB或者3DES加密算法,只需要改动上述代码中"EVP_EncryptInit"以及"EVP_DecryptInit"里的加解密处理类型即可;

© 著作权归作者所有

ZZ-D-NEMO
粉丝 0
博文 5
码字总数 3822
作品 0
顺义
程序员
私信 提问
3des 加密

有两句话是这么说的: 1)算法和数据结构就是编程的一个重要部分,你若失掉了算法和数据结构,你就把一切都失掉了。 2)编程就是算法和数据结构,算法和数据结构是编程的灵魂。 注意,这可不...

zhanghongjie0302
2017/07/30
0
0
【Java小工匠聊密码学】--对称加密--概述

1、什么是对称加密   对称加密算法是应用较早的加密算法,技术成熟。在对称加密算法中,数据发信方将明文“原始数据”和“加密密钥“一起经过特殊加密算法处理后,使其变成复杂的加密密文发...

追梦着
2018/06/10
0
0
Java AES算法和openssl配对

近日工作上的原因,需要实现Java AES算法和C语言下基于openssl的AES 算法通信。这是个老问题了,网上搜到不少资料,但都不是很详细,没能解决问题。只能自己来了。 先说说AES算法。AES算法的...

gesuper
2013/11/04
7.5K
4
openssl AES 加密/解密

AES算法 AES进行加/解密需要考虑下面三个设置。 密钥 使用的密钥长度为128/192/256位,这里以128位为例 初始向量 初始向量位128位 填充 AES以128位,即16字节为单位进行操作,如果明文长度不...

qlee
2017/11/01
4K
0
Java--Base64与消息摘要算法

Base64本质不是加密码算法。 安全和密码 常用安全体系 对称加密:指加密密钥与解密密钥相同。 非对称加密:指加密密钥与解密密钥不同,密钥分公钥、私钥。 散列函数:用来验证数据的完整性。...

BtWangZhi
03/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

面向海量数据的极致成本优化-云HBase的一体化冷热分离

前言 随着业务的持续发展,业务数据库存储量会持续增长。通常数据量过亿时,就需要考虑做分库分表,或者选择扩展能力更好的NOSQL/NewSQL数据库,如HBase就可以单表支持PB级数据,足够满足大多...

阿里云官方博客
26分钟前
3
0
最新最全国内外架构开源技术干货资料

大家好,废话不多说,整理了精心收集了各类资源。 声明,如侵犯个人利益,请联系小编,会立即删除相关资料。 领取方式在文末 求转发列表 好了,由于资源太多啦,就不一一列举了。 大家按照下...

泥瓦匠BYSocket
29分钟前
6
0
springmvc jsp访问不了css

在jsp中引入css,一直报404错误,直接访问css,也无法访问 将css文件移出WEB-INF,因为处于安全性考虑,这个目录禁止外部访问。 当引用css时,可以直接用绝对路径${pageContext.request.conte...

沉迷于编程的小菜菜
31分钟前
4
0
android 系统版本 9.1网络请求遇到坑

网络请求异常: E/http: CLEARTEXT communication to plat.xunlinkeji.cn not permitted by network security policy 在res下新建一个xml目录 创建名为network_security_config.xml 文件 ,该......

MrLins
48分钟前
5
0
Istio 1.3 发布,HTTP 遥测不再需要 Mixer

> 原文链接:Istio 1.3 发布,HTTP 遥测不再需要 Mixer Istio 是 Google、IBM 和 Lyft 联合开源的服务网格(Service Mesh)框架,旨在解决大量微服务的发现、连接、管理、监控以及安全等问题...

米开朗基杨
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部