导航:首页 > 编程语言 > cphp3des

cphp3des

发布时间:2022-11-27 08:29:34

⑴ 什么是3DES对称加密算法

DES加密经过下面的步骤
1、提供明文和密钥,将明文按照64bit分块(对应8个字节),不足8个字节的可以进行填充(填充方式多种),密钥必须为8个字节共64bit
填充方式:

当明文长度不为分组长度的整数倍时,需要在最后一个分组中填充一些数据使其凑满一个分组长度。
* NoPadding
API或算法本身不对数据进行处理,加密数据由加密双方约定填补算法。例如若对字符串数据进行加解密,可以补充\0或者空格,然后trim

* PKCS5Padding
加密前:数据字节长度对8取余,余数为m,若m>0,则补足8-m个字节,字节数值为8-m,即差几个字节就补几个字节,字节数值即为补充的字节数,若为0则补充8个字节的8
解密后:取最后一个字节,值为m,则从数据尾部删除m个字节,剩余数据即为加密前的原文。
例如:加密字符串为为AAA,则补位为AAA55555;加密字符串为BBBBBB,则补位为BBBBBB22;加密字符串为CCCCCCCC,则补位为CCCCCCCC88888888。

* PKCS7Padding
PKCS7Padding 的填充方式和PKCS5Padding 填充方式一样。只是加密块的字节数不同。PKCS5Padding明确定义了加密块是8字节,PKCS7Padding加密快可以是1-255之间。
2、选择加密模式

**ECB模式** 全称Electronic Codebook模式,译为电子密码本模式
**CBC模式** 全称Cipher Block Chaining模式,译为密文分组链接模式
**CFB模式** 全称Cipher FeedBack模式,译为密文反馈模式
**OFB模式** 全称Output Feedback模式,译为输出反馈模式。
**CTR模式** 全称Counter模式,译为计数器模式。
3、开始加密明文(内部原理--加密步骤,加密算法实现不做讲解)

image
1、将分块的64bit一组组加密,示列其中一组:将此组进行初始置换(IP置换),目的是将输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位。
2、开始Feistel结构的16次转换,第一次转换为:右侧数据R0和子密钥经过轮函数f生成用于加密左侧数据的比特序列,与左侧数据L0异或运算,
运算结果输出为加密后的左侧L0,右侧数据则直接输出为右侧R0。由于一次Feistel轮并不会加密右侧,因此需要将上一轮输出后的左右两侧对调后才正式完成一次Feistel加密,
3、DES算法共计进行16次Feistel轮,最后一轮输出后左右两侧无需对调,每次加密的子密钥不相同,子密钥是通过秘钥计算得到的。
4、末置换是初始置换的逆过程,DES最后一轮后,左、右两半部分并未进行交换,而是两部分合并形成一个分组做为末置换的输入
DES解密经过下面的步骤
1、拿到密文和加密的密钥
2、解密:DES加密和解密的过程一致,均使用Feistel网络实现,区别仅在于解密时,密文作为输入,并逆序使用子密钥。
3、讲解密后的明文去填充 (padding)得到的即为明文
Golang实现DES加密解密
package main

import (
"fmt"
"crypto/des"
"bytes"
"crypto/cipher"
)

func main() {
var miwen,_= DESEncode([]byte("hello world"),[]byte("12345678"))
fmt.Println(miwen) // [11 42 146 232 31 180 156 225 164 50 102 170 202 234 123 129],密文:最后5位是补码
var txt,_ = DESDecode(miwen,[]byte("12345678"))
fmt.Println(txt) // [104 101 108 108 111 32 119 111 114 108 100]明码
fmt.Printf("%s",txt) // hello world
}
// 加密函数
func DESEncode(orignData, key []byte)([]byte,error){

// 建立密码块
block ,err:=des.NewCipher(key)
if err!=nil{ return nil,err}

// 明文分组,不足的部分加padding
txt := PKCS5Padding(orignData,block.BlockSize())

// 设定加密模式,为了方便,初始向量直接使用key充当了(实际项目中,最好别这么做)
blockMode := cipher.NewCBCEncrypter(block,key)

// 创建密文长度的切片,用来存放密文字节
crypted :=make([]byte,len(txt))

// 开始加密,将txt作为源,crypted作为目的切片输入
blockMode.CryptBlocks(crypted,txt)

// 将加密后的切片返回
return crypted,nil
}
// 加密所需padding
func PKCS5Padding(ciphertext []byte,size int)[]byte{
padding := size - len(ciphertext)%size
padTex := bytes.Repeat([]byte{byte(padding)},padding)
return append(ciphertext,padTex...)
}
// 解密函数
func DESDecode(cripter, key []byte) ([]byte,error) {
// 建立密码块
block ,err:=des.NewCipher(key)
if err!=nil{ return nil,err}

// 设置解密模式,加密模式和解密模式要一样
blockMode := cipher.NewCBCDecrypter(block,key)

// 设置切片长度,用来存放明文字节
originData := make([]byte,len(cripter))

// 使用解密模式解密,将解密后的明文字节放入originData 切片中
blockMode.CryptBlocks(originData,cripter)

// 去除加密的padding部分
strByt := UnPKCS5Padding(origenData)

return strByt,nil
}
// 解密所需要的Unpadding
func UnPKCS5Padding(origin []byte) []byte{
// 获取最后一位转为整型,然后根据这个整型截取掉整型数量的长度
// 若此数为5,则减掉转换明文后的最后5位,即为我们输入的明文
var last = int(origin[len(origin)-1])
return origin[:len(origin)-last]
}
注意:在设置加密模式为CBC的时候,我们需要设置一个初始化向量,这个量的意思 在对称加密算法中,如果只有一个密钥来加密数据的话,明文中的相同文字就会也会被加密成相同的密文,这样密文和明文就有完全相同的结构,容易破解,如果给一个初始化向量,第一个明文使用初始化向量混合并加密,第二个明文用第一个明文的加密后的密文与第二个明文混合加密,这样加密出来的密文的结构则完全与明文不同,更加安全可靠。CBC模式图如下

CBC
3DES
DES 的常见变体是三重 DES,使用 168 位的密钥对资料进行三次加密的一种机制;它通常(但非始终)提供极其强大的安全性。如果三个 56 位的子元素都相同,则三重 DES 向后兼容 DES。
对比DES,发现只是换了NewTripleDESCipher。不过,需要注意的是,密钥长度必须24byte,否则直接返回错误。关于这一点,php中却不是这样的,只要是8byte以上就行;而java中,要求必须是24byte以上,内部会取前24byte(相当于就是24byte)。另外,初始化向量长度是8byte(目前各个语言都是如此,不是8byte会有问题)

⑵ PHP des3加密key长度不到24位怎么办

php使用3DES 加密时,如果加密用的key长度不足可以使用 “”来进行补位。

假设使用了 pkcs#5 填充,key的长度为8位,但是实际给的key只有7位,那么可以使用一个 “”进行补位。如图:

其他情况,可以以此类推。

⑶ 如何用C实现3DES算法..

//功能:实现DES及3DES加解密的算法

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "des.h"

//函数声明
int Do_DES(char* strSrc, char* strKey, char* strDest, char flag);
int Do_3DES(char* strSrc, char* strKey, char* strDest, char flag);

//主函数
int main(int argc, char** argv)
{
char src16[16+1],key16[16+1],key48[48+1],dest16[16+1];

if(argc != 3)
{
fprintf(stderr,"Usage: [%s -e|-d s|3]\n",argv[0]);
exit(1);
}

if(strcmp(argv[2],"-s") == 0)
{
if(strcmp(argv[1],"-e") == 0)
{
fprintf(stderr,"Please input the string that you want to encrypt(16 hex number):\n");
memset(src16,0,sizeof(src16));
scanf("%s",src16);
fprintf(stderr,"Please input the Key string(16 hex number):\n");
memset(key16,0,sizeof(key16));
scanf("%s",key16);
memset(dest16,0,sizeof(dest16));
Do_DES(src16,key16,dest16,'e');
fprintf(stderr,"Result: [%s]\n",dest16);
}
else if(strcmp(argv[1],"-d") == 0)
{
fprintf(stderr,"Please input the string that you want to decrypt(16 hex number):\n");
memset(src16,0,sizeof(src16));
scanf("%s",src16);
fprintf(stderr,"Please input the Key string(16 hex number):\n");
memset(key16,0,sizeof(key16));
scanf("%s",key16);
memset(dest16,0,sizeof(dest16));
Do_DES(src16,key16,dest16,'d');
fprintf(stderr,"Result: [%s]\n",dest16);
}
else
return -1;
}
else if(strcmp(argv[2],"-3") == 0)
{
if(strcmp(argv[1],"-e") == 0)
{
fprintf(stderr,"Please input the string that you want to encrypt(16 hex number):\n");
memset(src16,0,sizeof(src16));
scanf("%s",src16);
fprintf(stderr,"Please input the Key string(16 hex number):\n");
memset(key48,0,sizeof(key48));
scanf("%s",key48);
memset(dest16,0,sizeof(dest16));
Do_3DES(src16,key48,dest16,'e');
fprintf(stderr,"Result: [%s]\n",dest16);
}
else if(strcmp(argv[1],"-d") == 0)
{
fprintf(stderr,"Please input the string that you want to decrypt(16 hex number):\n");
memset(src16,0,sizeof(src16));
scanf("%s",src16);
fprintf(stderr,"Please input the Key string(16 hex number):\n");
memset(key48,0,sizeof(key48));
scanf("%s",key48);
memset(dest16,0,sizeof(dest16));
Do_3DES(src16,key48,dest16,'d');
fprintf(stderr,"Result: [%s]\n",dest16);
}
else
return -1;
}
else
return -1;

return 0;
}

//做DES加密或解密运算
int Do_DES(char* strSrc, char* strKey, char* strDest, char flag)
{
int i,j;
unsigned char subKey[16][48+1],byte8[8+1],bits[64+1],strTmp[64+1];
unsigned char L0[32+1],R0[32+1],Lx[32+1],Rx[32+1];

if(!( flag == 'e' || flag == 'E' || flag == 'd' || flag == 'D'))
return -1;
if(strSrc == NULL || strKey == NULL)
return -2;

if(flag == 'e' || flag == 'E')
{
memset(byte8,0,sizeof(byte8));
BCDToByte(strKey, 16, byte8);
memset(bits,0,sizeof(bits));
ByteToBit(byte8, 8, bits);

Des_GenSubKey(bits,subKey);

BCDToByte(strSrc, 16, byte8);
ByteToBit(byte8, 8, bits);
Des_IP(bits, strTmp);
memcpy(L0,strTmp,32);
memcpy(R0,strTmp+32,32);

for(i=0;i<16;i++)
{
memcpy(Lx,R0,32);
Des_F(R0,subKey[i],Rx);
Do_XOR(L0,32,Rx);
memcpy(L0,Lx,32);
memcpy(R0,Rx,32);
}
memcpy(bits,R0,32);
memcpy(bits+32,L0,32);
Des_IP_1(bits,strTmp);
BitToByte(strTmp,64,byte8);
ByteToBCD(byte8,8,strDest);
}
else
{
memset(byte8,0,sizeof(byte8));
BCDToByte(strKey, 16, byte8);
memset(bits,0,sizeof(bits));
ByteToBit(byte8, 8, bits);

Des_GenSubKey(bits,subKey);

BCDToByte(strSrc, 16, byte8);
ByteToBit(byte8, 8, bits);
Des_IP(bits, strTmp);
memcpy(L0,strTmp,32);
memcpy(R0,strTmp+32,32);

for(i=0;i<16;i++)
{
memcpy(Lx,R0,32);
Des_F(R0,subKey[15-i],Rx);
Do_XOR(L0,32,Rx);
memcpy(L0,Lx,32);
memcpy(R0,Rx,32);
}
memcpy(bits,R0,32);
memcpy(bits+32,L0,32);
Des_IP_1(bits,strTmp);
BitToByte(strTmp,64,byte8);
ByteToBCD(byte8,8,strDest);
}

return 0;
}

//做3DES加密或解密运算
int Do_3DES(char* strSrc, char* strKey, char* strDest, char flag)
{
unsigned char strBCDKey[32+1],strByteKey[16+1];
unsigned char strMidDest1[16+1],strMidDest2[16+1];
unsigned char strLKey[16+1],strMKey[16+1],strRKey[16+1];

if(!( flag == 'e' || flag == 'E' || flag == 'd' || flag == 'D'))
return -1;
if(strSrc == NULL || strKey == NULL)
return -2;

if(strlen(strKey) < 32)
return -3;

if(flag == 'e' || flag == 'E')
{
memset(strBCDKey,0,sizeof(strBCDKey));
memcpy(strBCDKey,strKey,32);

memset(strLKey,0,sizeof(strLKey));
memcpy(strLKey,strBCDKey,16);
memset(strRKey,0,sizeof(strRKey));
memcpy(strRKey,strBCDKey+16,16);

Do_DES(strSrc,strLKey,strMidDest1,'e');
Do_DES(strMidDest1,strRKey,strMidDest2,'d');
Do_DES(strMidDest2,strLKey,strMidDest1,'e');

memcpy(strDest,strMidDest1,16);
}
else
{
memset(strBCDKey,0,sizeof(strBCDKey));
memcpy(strBCDKey,strKey,32);

memset(strLKey,0,sizeof(strLKey));
memcpy(strLKey,strBCDKey,16);
memset(strRKey,0,sizeof(strRKey));
memcpy(strRKey,strBCDKey+16,16);

Do_DES(strSrc,strLKey,strMidDest1,'d');
Do_DES(strMidDest1,strRKey,strMidDest2,'e');
Do_DES(strMidDest2,strLKey,strMidDest1,'d');

memcpy(strDest,strMidDest1,16);
}

return 0;
}

⑷ php 3des 里的iv是什么东东

iv的作用主要是用于产生密文的第一个block,以使最终生成的密文产生差异(明文相同的情况下),使密码攻击变得更为困难

⑸ php 3des 加密问题

3des应该是通过DES加密的方式去加密的,
<?php
$key = "this is a secret key";
$input = "Let us meet at 9 o'clock at the secret place.";

$td = mcrypt_mole_open('tripledes', '', 'ecb', '');
$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, $key, $iv);
$encrypted_data = mcrypt_generic($td, $input);
mcrypt_generic_deinit($td);
mcrypt_mole_close($td);
?>
<?php
//.h
function mdecrypt_3des($input,$key){
$td = mcrypt_mole_open(MCRYPT_3DES,'',MCRYPT_MODE_ECB,'');
$blocksize = mcrypt_enc_get_block_size($td);
$keysize = mcrypt_enc_get_key_size($td);
$iv_size = mcrypt_enc_get_iv_size($td);
$iv = mcrypt_create_iv ($iv_size,MCRYPT_RAND);
$input_len = strlen($input);
$padsize = $blocksize-($input_len%$blocksize);
$input .= str_repeat(pack ('C*',$padsize),$padsize);
@mcrypt_generic_init($td, $key, $iv);//key 最长允许24位 ?

//return urlencode(base64_encode(mcrypt_generic($td,$input)));//加密
return rtrim(mdecrypt_generic($td,base64_decode(urldecode($input))),"\u0008");//解密
}
?>
这段代码是抄来的,希望能够解决你的问题

⑹ 怎么用php进行3des解密

<?php
classCrypt3Des{
var$key;
functionCrypt3Des($key){
$this->key=$key;
}

functionencrypt($input){
$size=mcrypt_get_block_size(MCRYPT_3DES,'ecb');
$input=$this->pkcs5_pad($input,$size);
$key=str_pad($this->key,24,'0');
$td=mcrypt_mole_open(MCRYPT_3DES,'','ecb','');
$iv=@mcrypt_create_iv(mcrypt_enc_get_iv_size($td),MCRYPT_RAND);
@mcrypt_generic_init($td,$key,$iv);
$data=mcrypt_generic($td,$input);
mcrypt_generic_deinit($td);
mcrypt_mole_close($td);
//$data=base64_encode($this->PaddingPKCS7($data));
$data=base64_encode($data);
return$data;
}

functiondecrypt($encrypted){
$encrypted=base64_decode($encrypted);
$key=str_pad($this->key,24,'0');
$td=mcrypt_mole_open(MCRYPT_3DES,'','ecb','');
$iv=@mcrypt_create_iv(mcrypt_enc_get_iv_size($td),MCRYPT_RAND);
$ks=mcrypt_enc_get_key_size($td);
@mcrypt_generic_init($td,$key,$iv);
$decrypted=mdecrypt_generic($td,$encrypted);
mcrypt_generic_deinit($td);
mcrypt_mole_close($td);
$y=$this->pkcs5_unpad($decrypted);
return$y;
}

functionpkcs5_pad($text,$blocksize){
$pad=$blocksize-(strlen($text)%$blocksize);
return$text.str_repeat(chr($pad),$pad);
}

functionpkcs5_unpad($text){
$pad=ord($text{strlen($text)-1});
if($pad>strlen($text)){
returnfalse;
}
if(strspn($text,chr($pad),strlen($text)-$pad)!=$pad){
returnfalse;
}
returnsubstr($text,0,-1*$pad);
}

functionPaddingPKCS7($data){
$block_size=mcrypt_get_block_size(MCRYPT_3DES,MCRYPT_MODE_CBC);
$padding_char=$block_size-(strlen($data)%$block_size);
$data.=str_repeat(chr($padding_char),$padding_char);
return$data;
}
}

用法:

$crypt=newCrypt3Des('密钥');
$code="加密后的字符串";
echo$crypt->decrypt($code);

echo出来的就是结果

⑺ php 经3des 怎样兼容 java

例直接拿用
package com.nnff.des;

import java.security.Security;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

/*字符串 DESede(3DES) 加密
* ECB模式/使用PKCS7式填充足位,目前给密钥192位
* 3DES(即Triple DES)DES向AES渡加密算(1999NIST3-DES指定渡
* 加密标准)DES更安全变形DES基本模块通组合组设计组加
* 密算其具体实现:设Ek()Dk()代表DES算加密解密程K代表DES算使用
* 密钥P代表明文C代表密表
* 3DES加密程:C=Ek3(Dk2(Ek1(P)))
* 3DES解密程:P=Dk1((EK2(Dk3(C)))
* */
public class ThreeDes {

/**
* @param argsjava调用sun公司提供3DES加密解密算需要使
* 用$JAVA_HOME/jre/lib/目录4jar包:
*jce.jar
*security/US_export_policy.jar
*security/local_policy.jar
*ext/sunjce_provider.jar
*/

private static final String Algorithm = "DESede"; //定义加密算,用 DES,DESede,Blowfish
//keybyte加密密钥度24字节
//src加密数据缓冲区(源)
public static byte[] encryptMode(byte[] keybyte,byte[] src){
try {
//密钥
SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
//加密
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.ENCRYPT_MODE, deskey);
return c1.doFinal(src);//单面加密或解密
} catch (java.security.NoSuchAlgorithmException e1) {
// TODO: handle exception
e1.printStackTrace();
}catch(javax.crypto.NoSuchPaddingException e2){
e2.printStackTrace();
}catch(java.lang.Exception e3){
e3.printStackTrace();
}
return null;
}

//keybyte加密密钥度24字节
//src加密缓冲区
public static byte[] decryptMode(byte[] keybyte,byte[] src){
try {
//密钥
SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
//解密
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.DECRYPT_MODE, deskey);
return c1.doFinal(src);
} catch (java.security.NoSuchAlgorithmException e1) {
// TODO: handle exception
e1.printStackTrace();
}catch(javax.crypto.NoSuchPaddingException e2){
e2.printStackTrace();
}catch(java.lang.Exception e3){
e3.printStackTrace();
}
return null;
}

//转换十六进制字符串
public static String byte2Hex(byte[] b){
String hs="";
String stmp="";
for(int n=0; n<b.length; n++){
stmp = (java.lang.Integer.toHexString(b[n]& 0XFF));
if(stmp.length()==1){
hs = hs + "0" + stmp;
}else{
hs = hs + stmp;
}
if(n<b.length-1)hs=hs+":";
}
return hs.toUpperCase();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//添加新安全算,用JCE要添加进
Security.addProvider(new com.sun.crypto.provider.SunJCE());
final byte[] keyBytes = {0x11, 0x22, 0x4F, 0x58,
(byte)0x88, 0x10, 0x40, 0x38, 0x28, 0x25, 0x79, 0x51,
(byte)0xCB,
(byte)0xDD, 0x55, 0x66, 0x77, 0x29, 0x74,
(byte)0x98, 0x30, 0x40, 0x36,
(byte)0xE2
}; //24字节密钥
String szSrc = "This is a 3DES test. 测试";
System.out.println("加密前字符串:" + szSrc);
byte[] encoded = encryptMode(keyBytes,szSrc.getBytes());
System.out.println("加密字符串:" + new String(encoded));

byte[] srcBytes = decryptMode(keyBytes,encoded);
System.out.println("解密字符串:" + (new String(srcBytes)));
}
}
-

⑻ 3DES的算法介绍

3DES又称Triple DES,是DES加密算法的一种模式,它使用3条56位的密钥对数据进行三次加密。数据加密标准(DES)是美国的一种由来已久的加密标准,它使用对称密钥加密法,并于1981年被ANSI组织规范为ANSI X.3.92。DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES,3DES更为安全。
3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),加密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密文,这样:
3DES加密过程为:C=Ek3(Dk2(Ek1(P)))
3DES解密过程为:P=Dk1(EK2(Dk3(C)))

⑼ php做的网站,用户登录的密码如何用3des加密

只是加密方式不一样而已,3des需要自己写一些自定义函数来处理。


网上可以找到很多现成的方法。

网络 php 3des加密,我找到了一大堆。

https://www..com/s?wd=php%203des%E5%8A%A0%E5%AF%86&rsv_spt=1&rsv_iqid=0x9510baa000001629&issp=1&f=3&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=home_pg&rsv_enter=1&rsv_sug3=6&rsv_sug1=5&rsv_sug7=100&rsv_sug2=0&prefixsug=php%2520%2526lt%253Bdes&rsp=0&inputT=2501&rsv_sug4=3447
阅读全文

与cphp3des相关的资料

热点内容
加固的app反编译 浏览:908
字符串混淆算法 浏览:88
辽宁海关压缩时间 浏览:540
web备忘录源码 浏览:35
芝麻开门的新app怎么用 浏览:398
与何皇后有染的三国小说 浏览:198
msgtopdf 浏览:324
孕妇系列哪几部好看 浏览:315
有关楼上男人看楼下女人的电影 浏览:889
android70预览版 浏览:879
最新适合年轻人看的电影 浏览:188
神经网络算法可以解决吗 浏览:148
南瓜电影下载的视频放哪个文件夹 浏览:844
不卡顿的电视剧官网 浏览:279
凿空者之雪域天马演员表 浏览:214
怎么关掉安卓手机触摸上方黑屏 浏览:749
男主娶母女 浏览:482
阁瑞斯压缩机漏电怎么处理 浏览:19
有个叫阿水的在一个岛上的电影叫什么 浏览:161
韩剧食物链酒吧老板娘的演员叫什么 浏览:485