3des加密中- pkcs#5和pkcs#7填充的区别

Java实现3DES加密解密(DESede/ECB/PKCS5Padding使用) 阅读详情
pkcs#5和pkcs#7填充的区别

最近做到了关于加密和解密的部分。

使用算法AES的时候,涉及到数据填充的部分,数据的填充有很多种方案,用的比较多的有pkcs#5,pkcs#7,

下面的都是从网上转来的。结论就是在AES 的使用中,pkcs#5填充和pkcs#7填充没有任何区别。

 

PKCS #7 填充字符串由一个字节序列组成,每个字节填充该填充字节序列的长度。

假定块长度为 8,数据长度为 9,
数据: FF FF FF FF FF FF FF FF FF
PKCS7 填充: FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07

简单地说, PKCS5, PKCS7和SSL3, 以及CMS(Cryptographic Message Syntax)

有如下相同的特点:
1)填充的字节都是一个相同的字节
2)该字节的值,就是要填充的字节的个数

如果要填充8个字节,那么填充的字节的值就是0×8;
要填充7个字节,那么填入的值就是0×7;

…

如果只填充1个字节,那么填入的值就是0×1;

这种填充方法也叫PKCS5, 恰好8个字节时还要补8个字节的0×08

正是这种即使恰好是8个字节也需要再补充字节的规定,可以让解密的数据很确定无误的移除多余的字节。

 

 

标准

PKCS #7: Cryptographic Message Syntax

在 10.3节中讲到了上面提到的填充算法,  对Block Size并没有做规定

PKCS #5: Password-Based Cryptography Specification

在6.1.1 中对 填充做了说明
但是因为该标准 只讨论了 8字节(64位) 块的加密, 对其他块大小没有做说明
其 填充算法跟 PKCS7是一样的

后来 AES 等算法, 把BlockSize扩充到 16个字节

比如, Java中
Cipher.getInstance(“AES/CBC/PKCS5Padding”)
这个加密模式
跟C#中的
RijndaelManaged cipher = new RijndaelManaged();
cipher.KeySize = 128;
cipher.BlockSize = 128;
cipher.Mode = CipherMode.CBC;
cipher.Padding = PaddingMode.PKCS7;
的加密模式是一样的

因为AES并没有64位的块, 如果采用PKCS5, 那么实质上就是采用PKCS7


####################################################

pkcs7_pad()

pkcs7_unpad()

php 3des 加密向量 初始化

php版3des 工作模式是ecb 与java兼容

广大phper在工作中如果有幸给电信运营商(移动,联通,电信)提供服务的话,一般会遇到加密算法,由于一般接触不到,做的时候大多会多费一番功夫

因为php的3des与电信运营商们普遍使用的java,.net的加密有一定的不同,我是在那边的技术支持的帮助下,稀里糊涂的做出来的。

我碰到的用到cbc加密

function EncrypTtripleDESHash($value,$key=null,$vi=null)
{
$hashResult = mhash(MHASH_SHA1,$value);//做sha1摘要
$to3DES = base64_encode($hashResult);                    //为摘要作base64加密
$k = $key == null ? $this->key : $key;            //准备3des密钥
$i = $vi == null ? $this->vi : $vi;                //准备3des初始向量
$to3DES .= “”;                            //加””是因为php mcrypt加密包的bug
//$desResult = mcrypt_cbc(MCRYPT_TripleDES,$k,$to3DES,MCRYPT_ENCRYPT,$i);    //3des加密 这个函数已经废止,换成下面一堆

$td = mcrypt_module_open(MCRYPT_3DES, ”, MCRYPT_MODE_CBC, ”);
$iv = $this->iv;
$key = $this->key;
mcrypt_generic_init($td, $key, $iv);
$desResult = mcrypt_generic($td, $to3DES);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

return (base64_encode($desResult));                    //返回base64后的加密结果
}

对于程序做几点解释

1. 这个东西,你拷贝到php 代码中就可以了,这个是补足用的,当然你也可以用什么 pkcs5, pkcs7之类的补足算法

2. mcrypt_cbc 这个函数目前已经废弃, 但是我的php版本5.9 依然可以运行,为了你的代码有更好的向上兼容性,你应该切换到下面的一堆

mcrypt_generic_init($td, $key, $iv);
$desResult = mcrypt_generic($td, $to3DES);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

3. 2中的这两种方式(cbc方式)所接受  $key是24位,$vi是8位,新手一般高不清楚应该如何处理 加密向量和密钥

所以如果你的得到的 $key为48位, $vi 为16位, 那么请用 pack()函数来处理他们两个

不了解的清查下手册,本站提供中文手册下载。

php中文手册免费下载: download

$key = pack(‘H48′,$key);结果为24位

$vi = pack(‘H16′,$vi);结果为8位

如果你得到的key  为32位 vi为 12位

可以对他们进行如下处理

$key = base64_decode($key);结果为24位

$vi = base64_decode($vi);结果为8位

如果本身就为 24位和8位,那你就带入试一下吧

3.如果用到 hash 的sha1算法,那么你可能需要试一下

因为现在 提供了 sha1(),这个函数,专门做sha1摘要,但是我的程序里面,sha1函数和 mhash(MHASH_SHA1,$value);的结果是不一样的, mhash的结果是正确的,所以你可能需要两个函数都试一下。

另外,贴上补足算法  pkcs7, pkcs5

/**
*param $text string 需要pkcs5填充的字符串
*param $blocksize 填充方式,块大小
*
*return 填充的结果
**/
private function pkcs5_pad ($text, $blocksize)
{
$pad = $blocksize – (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
/**
*param $text string 需要pkcs5你填充的字符串
*
*return 解码的结果
**/
private function pkcs5_unpad($text)
{
$pad = ord($text{strlen($text)-1});
if ($pad > strlen($text)) {
return false;
}
if (strspn($text, chr($pad), strlen($text) – $pad) != $pad){
return false;
}
return substr($text, 0, -1 * $pad);
}

private function pkcs7_pad ($data, $blocksize)
{
//$block_size = mcrypt_get_block_size(‘tripledes’, ‘ecb’);
$padding_char = $blocksize – (strlen($data) % $blocksize);
$data .= str_repeat(chr($padding_char), $padding_char);
return $data;
}
private function pkcs7_unpad ($text)
{
$pad = ord($text{strlen($text) – 1});
if ($pad > strlen($text))
{
return false;
}
if (strspn($text, chr($pad), strlen($text) – $pad) != $pad)
{
return false;
}
return substr($text, 0, – 1 * $pad);
}

就啰嗦这么多了,希望对你们有帮助。

DES 加密 DES/ECB/PKCS7Padding package com.sentemail.DES; import java.security.SecureRandom; import java.security.Security; /*扩展类*/ import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import org.bouncyca 阅读详情

相关推荐

3DES加密算法核心原理与CBC模式实现深度解析

对称加密算法是保障数据机密性的核心技术,其核心原理在于使用相同的密钥进行加密和解密操作。DES(Data Encryption Standard)作为经典的对称分组密码,采用Feistel网络结构和S盒非线性变换,奠定了分组密码的设计基础。为应对计算能力提升带来的安全挑战,3DES(三重数据加密标准)应运而生,它通过三次DES运算(EDE模式)有效增加了密钥长度,在提升安全性的同时保持了与遗留DES系统的向后兼容性。在工程实践中,为消除ECB模式的安全缺陷,CBC(密码分组链接)模式成为主流选择,它通过引入

chunqingtai2922的博客 379

openssl库编译-及16进制的key转Rsa数据结构

1. linux 下编译 源码地址为:https://www.openssl.org/source/old/;当前最新版本为 1.1.0f,https://www.openssl.org/source/old/1.1.0/openssl-1.1.0f.tar.gz 源码编译 解压之后,进入源码目录openssl-1.1.0f,执行如下命令。因为只需要编译静态库,也没有特殊要求,所以使用的编译选项配置很简单: 1 2 ./config-fPIC no-share.

smilestone322的专栏 3606

从零实现DES与3DES算法:深入理解对称加密原理与Python实战

对称加密是信息安全的基础,它使用相同的密钥进行加密和解密,确保数据的机密性。其核心原理在于通过复杂的置换、代换和迭代运算,将明文转换为难以破解的密文。DES(数据加密标准)作为经典的分组密码算法,采用Feistel网络结构,实现了加解密流程的统一,并通过S盒提供非线性变换,是理解现代密码学的关键。随着计算能力提升,DES的56位密钥已显不足,3DES通过多次应用DES(如EDE模式)有效增强了安全性,曾广泛应用于金融支付等场景。本文通过Python代码实战,详细拆解了DES的Feistel结构、轮函数、子密

weixin_34248705的博客 418

填充模式:PKCS#5/PKCS7

填充模式:PKCS#5/PKCS7

test1280 3万+

Delphi中DES/3DES算法实现:原理、兼容性与工程实践

对称加密是保障数据机密性的基础技术,其核心在于发送方和接收方使用相同的密钥进行加解密操作。DES(数据加密标准)作为经典的分组密码算法,采用Feistel网络结构和S盒非线性变换实现混淆与扩散,尽管其56位密钥长度已不足以抵御现代暴力破解,但其衍生算法3DES通过三重加密将有效密钥长度提升至112位,在特定场景下仍具实用价值。在金融数据交换、工业控制软件和历史系统接口兼容等传统企业级应用中,由于存量系统的硬性要求,DES/3DES的稳定实现成为关键工程技能。本文聚焦于在Delphi开发环境中,从置换表、S盒

angou6476的博客 646

Go语言实现三重DES加密:从原理到工程实践

对称加密是保障数据机密性的核心技术,其原理在于加密与解密使用相同的密钥。DES算法作为经典的分组密码,采用Feistel网络结构,通过多轮置换与代换实现混淆与扩散。随着计算能力提升,DES的56位密钥已显不足,三重DES(3DES)应运而生,通过三次DES操作(EDE模式)将有效密钥长度提升至112或168位,显著增强了安全性。在金融系统、遗留设备等特定场景中,3DES仍被广泛要求使用。本文以Go语言为例,深入探讨3DES的实现细节,涵盖密钥处理、PKCS#7填充、CBC/ECB工作模式整合等工程实践,并提

keke1314520的博客 390

JAVA 3DES 加密解密(二)

关于3DES算法C版本与JAVA版本的兼容问题 http://argv.info/2011/01/06/c-on-the-3des-algorithm-version-version-and-java-compatibility/ 今天在一个项目中遇到报文中密码字段3DES加密的情况,对方提供了JAVA版的例子,我这里下载了一个C版本的3DES实现源码包,尝试后发现

流氓兔-程序猿博客 3028

Python实现DES加密算法:从原理到实战避坑指南

对称加密是现代信息安全的基础,它使用同一密钥进行数据的加密与解密,保障了通信的机密性。其核心原理在于通过复杂的数学变换和迭代结构,将可读的明文转换为不可读的密文。DES(数据加密标准)作为对称加密的经典代表,其Feistel网络结构和S盒设计深刻影响了后续算法的发展,具有极高的教学与理解价值。在工程实践中,开发者常使用Python的`pycryptodome`等成熟库来实现DES,但需警惕密钥管理、IV使用和填充模式等常见陷阱,以确保兼容性与基础安全。本文以DES为切入点,深入剖析了其轮函数、密钥调度等核心

weixin_30786657的博客 426

W55MH32硬件DES/3DES加密模块驱动开发与优化实践

对称加密算法是嵌入式系统实现数据安全的核心技术之一,其中DES和3DES作为经典的分组密码算法,因其广泛的协议兼容性,在金融终端、工业控制等场景中仍有重要应用。其原理基于Feistel网络结构,通过多轮迭代和子密钥混淆实现数据加密。硬件加密模块通过专用电路实现这些复杂运算,相比软件实现能大幅提升处理速度、降低功耗并增强抗旁路攻击能力。在资源受限的嵌入式场景中,合理利用MCU内置的硬件加密引擎(如W55MH32的Crypto Accelerator)进行DES/3DES加解密,是平衡性能与安全性的关键。本文将

weixin_30471561的博客 421

PKCS#7填充

PKCS#7填充是分组密码中常用的字节填充方法,用于将任意长度明文补齐到分组大小的整数倍。其核心规则是每个填充字节的值等于需要填充的字节数。算法步骤包括计算缺少字节数、追加填充字节,解密时通过读取最后一个字节确定真实数据长度。PKCS#7与PKCS#5类似,但支持更大分组(1-255字节)。相比其他填充方式,它能明确区分填充与原始数据。使用时需注意解密后必须去除填充,且要配合完整性校验。典型实现如AES-CBC模式中,缺N字节就补N个0xN值。

应无所住而生其心 972

PKCS#5填充

摘要:PKCS#5填充是PKCS#7填充在8字节分组下的特例,两者算法完全一致。PKCS#5(1991)最初仅针对DES的8字节块,而PKCS#7(1998)将其扩展至1-255字节块。实际代码中均使用"PKCS5Padding"名称,但底层自动适配不同块大小(如AES-16字节)。填充规则为:缺k字节补k个0x0k,完整块需补整块0x08。现代文档中≥8字节分组统称PKCS#7填充,二者仅规范发布时间和块大小范围不同,格式和安全性完全相同。

应无所住而生其心 433

React前端DES/3DES加密实战:CryptoJS集成与安全实践指南

对称加密是保障数据传输机密性的基础技术,其核心原理是使用相同的密钥进行加密和解密。DES和3DES作为经典的对称加密算法,在理解加密原理和特定兼容性场景中仍有应用价值。在前端工程实践中,通过JavaScript库实现加密功能,能够为敏感数据交互增加额外安全层,尤其适用于对接遗留系统或满足特定数据安全规范的场景。本文聚焦于在React项目中,如何利用CryptoJS库安全、高效地集成DES与3DES算法,涵盖从密钥管理、CBC模式与PKCS7填充的应用,到性能优化及与后端交互的完整流程,为开发者提供一套兼顾安

weixin_34146805的博客 329

3des 加解密,填充模式PKCS7

3des 加解密,填充模式PKCS7,上面是我写的例子文档,测试没毛病

Java实现DES与3DES加密:原理、代码与生产实践

对称加密是信息安全领域的基石,它使用相同的密钥进行加密和解密,确保数据传输的机密性。其核心原理基于分组密码和Feistel网络结构,通过多轮迭代、S盒替换和P盒置换实现混淆与扩散,从而保障算法强度。这项技术的核心价值在于为金融交易、通信协议和遗留系统维护提供了基础的保密手段。在实际应用场景中,开发者常需处理历史系统的兼容性问题,例如银行接口或硬件协议。本文聚焦于DES和3DES这两种经典算法,详细解析其Feistel网络轮函数、子密钥生成过程,并演示如何在Java中通过标准库安全实现CBC工作模式与PKCS

weixin_33889665的博客 334

QMT vs Ptrade:量化交易新手如何根据需求选择券商系统(附实战案例)

本文对比了QMT和Ptrade两大券商量化交易系统的核心差异,帮助量化交易新手根据需求选择合适的平台。QMT适合技术面策略开发,执行效率高;Ptrade则提供全面的财务数据和复杂策略支持。通过实战案例,展示了如何结合两平台优势实现高效量化交易。

weixin_42683394的博客 527

ANSYS APDL实战:手把手教你搞定电磁-热耦合分析(附完整命令流)

本文通过一个工业感应加热线圈的实战案例,手把手教你使用ANSYS APDL完成电磁-热耦合分析。内容涵盖从几何建模、材料定义、网格划分到加载求解及后处理的完整流程,重点讲解了使用PLANE13单元进行双向耦合场分析的方法与命令流调试技巧,助力工程师快速掌握这一核心仿真能力。

weixin_29284201的博客 427

JAVA 3DES加解密与C对接

[color=red]C端同事给的密文(十六进制)是32位,但是我这边生成的是48位 刚开始工具类中使用的 Cipher cipher=Cipher.getInstance("DESede"); 后来把这个改为 Cipher cipher=Cipher.getInstance("DESede/ECB/NoPadding"); 生成的32位 与C端相同 Java 解密、工具类 见下文 ...

感受微风 562

哨兵一号数据snap预处理_利用SNAP软件进行Sentinel-1A卫星微波影像的预处理

利用SNAP软件对雷达影像进行预处理,主要包括热噪声去除、轨道文件校正、辐射定标、滤波校正、多普勒地形校正,最终获得入射角和后向散射信息。数据:本次实验所用数据为哨兵一号(Sentinel-1A)干涉宽幅模式(Interferometric Wideswath,IW)下经过多视处理和地距转换的GRD格式产品一般处理流程如下:0 SNAP软件安装软件安装:安装成功后打开SNAP后如图所示:1 数据...

weixin_30000407的博客 1万+

game-icon-pack完整指南:800+免费圆角游戏图标,独立开发者必备的一站式UI资源包

game-icon-pack(游戏图标包)是一个免费的圆角风格图标素材库,收录 800+ 枚统一视觉风格的游戏 UI 图标,提供 SVG 与 PNG 两种格式。无论你开发的是 RPG、卡牌还是休闲小游戏,都能在这里找到一套"开箱即用"的免费游戏图标资源,且采用 CC0 公共领域授权,可自由用于个人和商业项目。 ## 一、为什么选 game-icon-pack?🎮 很多独立开发者在找图标时都会

gitblog_00966的博客 863

从零开始使用CubeMX配置STM32使用lwip实现httpd服务器以及使用vscode编辑阅读keil代码(三)

使用stm32搭载lwip实现HTTPd服务器

qq_30623327的博客 5933

ml307 二次开发

中移物联网旗下4g模组官方网站官方教程id=514官方客户不知道啥时候上班 早上10点也说不在服务时间内 找不到官方的sdk下载路径。

myWorld001的博客 2880

Java DESede用C++ Openssl实现

原文地址: http://my.oschina.net/mawx/blog/85424最近在看一个项目的代码开发语言:C++开发环境:VS2005但有一个很别扭的地方,就是这个项目与外界的加密算法采用DESede,但其实现是采用jni调用java vm里面的函数。查了一下,可以用Openssl来实现,但要注意model(ECB)和padding(PKCS#5)#资料PKCS5, PKCS7和SSL

孤剑之家 2652

微信小程序 - 获取当前日期时间(函数封装)

效果图 前言 摘自微信小程序demo程序中utils.js方法。 普通newDate()出来的日期时间,并不是我们想要的格式,所以要进行格式整理。 解决方案 打开utils.js文件(随意),复制以下代码: /** *获取当前时间 *@description自定义日期分钟秒数 *@param{Object}date-newData()对象 *@returnString */ functionformatTime(date){ //年月日

🏆 前端领域优质创作者 2843
上一篇: VBS脚本简明教程
下一篇: DES
no pay no gay
博客等级 码龄14年 73粉丝 1原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值