Phpc语言3des

直接拿

包com . nnff . des;

导入Java . security . security;

导入javax . crypto . cipher;

导入javax . crypto . secret key;

导入javax . crypto . spec . secretkeyspec;

/*字符串解密(3DES)加密

* ECB模式/用PKCS7补脚,目前给密钥192位。

* 3DES(即三重DES)DES到AES的穿越加密计算(NIST 3-DES在1999年指定穿越

*加密标准)DES安全性更高,不变形。DES基本模块由组合组设计和组装。

*秘密计算的具体实现:设Ek()Dk()代表DES,加解密过程K代表DES。

*密钥p代表明文,c代表密表。

* 3DES加密过程:C=Ek3(Dk2(Ek1(P)))

* 3DES解密过程:P=Dk1((EK2(Dk3(C)))

* */

公共三级

/**

* @param argsjava调用sun公司提供3DES加密解密,需要制作。

*带有$JAVA _ HOME/JRE/lib/directory 4 jar包:

*jce.jar

*security/US_export_policy.jar

*安全性/local_policy.jar

*ext/sunjce_provider.jar

*/

私有静态最终字符串算法= " DESede//定义加密计算,用DES,DES,DESede,Blowfish。

//keybyte加密密钥为24字节。

//src加密数据缓冲区(源)

如何在公共静态字节中用c实现3DES算法.. //功能:实现DES和3DES加解密算法。

#包含stdio.h

#包含stdlib.h

#包含字符串. h

#包含“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],dest 16[16 1];

如果(argc!= 3)

{

fprintf(stderr,"用法:[%s -e|-d s|3]\n ",argv[0]);

出口(1);

}

if(strcmp(argv[2],-s))= = 0)

{

if(strcmp(argv[1],-e))= = 0)

{

fprintf(stderr,"请输入要加密的字符串(16进制数):\ n ");

memset(src16,0,sizeof(src 16));

scanf("%s ",src 16);

fprintf(stderr,"请输入密钥字符串(16进制数):\ n ");

memset(key16,0,sizeof(key 16));

scanf("%s ",key 16);

memset(dest16,0,sizeof(dest 16));

Do_DES(src16,key16,dest16,' e ');

fprintf(stderr," Result: [%s]\n ",dest 16);

}

else if(strcmp(argv[1],"-d") == 0)

{

fprintf(stderr,"请输入要解密的字符串(16进制数):\ n ");

memset(src16,0,sizeof(src 16));

scanf("%s ",src 16);

fprintf(stderr,"请输入密钥字符串(16进制数):\ n ");

memset(key16,0,sizeof(key 16));

scanf("%s ",key 16);

memset(dest16,0,sizeof(dest 16));

Do_DES(src16,key16,dest16,' d ');

fprintf(stderr," Result: [%s]\n ",dest 16);

}

其他

return-1;

}

else if(strcmp(argv[2],-3))= = 0

{

if(strcmp(argv[1],-e))= = 0)

{

fprintf(stderr,"请输入要加密的字符串(16进制数):\ n ");

memset(src16,0,sizeof(src 16));

scanf("%s ",src 16);

fprintf(stderr,"请输入密钥字符串(16进制数):\ n ");

memset(key48,0,sizeof(key 48));

scanf("%s ",key 48);

memset(dest16,0,sizeof(dest 16));

Do_3DES(src16,key48,dest16,' e ');

fprintf(stderr," Result: [%s]\n ",dest 16);

}

else if(strcmp(argv[1],"-d") == 0)

{

fprintf(stderr,"请输入要解密的字符串(16进制数):\ n ");

memset(src16,0,sizeof(src 16));

scanf("%s ",src 16);

fprintf(stderr,"请输入密钥字符串(16进制数):\ n ");

memset(key48,0,sizeof(key 48));

scanf("%s ",key 48);

memset(dest16,0,sizeof(dest 16));

Do_3DES(src16,key48,dest16,' d ');

fprintf(stderr," Result: [%s]\n ",dest 16);

}

其他

return-1;

}

其他

return-1;

返回0;

}

//做DES加密或解密。

int Do_DES(char* strSrc,char* strKey,char* strDest,char flag)

{

int i,j;

未签名的char子密钥[16][48 1],字节8[8 1],位[64 1],strTmp[64 1];

无符号字符L0[32 1],R0[32 1],Lx[32 1],Rx[32 1];

如果(!(flag = = ' E ' | | flag = = ' E ' | | flag = = ' D ' | | flag = = ' D '))

return-1;

if(strSrc == NULL || strKey == NULL)

return-2;

if(flag == 'e' || flag == 'E ')

{

memset(字节8,0,sizeof(字节8));

BCDToByte(strKey,16,byte 8);

memset(bits,0,sizeof(位));

ByteToBit(字节8,8,位);

Des_GenSubKey(bits,subKey);

BCD tobyte(str RC,16,byte 8);

ByteToBit(字节8,8,位);

Des_IP(bits,strTmp);

memcpy(L0,strTmp,32);

memcpy(R0,strTmp 32,32);

for(I = 0;i16我)

{

memcpy(Lx,R0,32);

Des_F(R0,子密钥[i],Rx);

Do_XOR(L0,32,Rx);

memcpy(L0,Lx,32);

memcpy(R0,Rx,32);

}

memcpy(位,R0,32);

memcpy(位32,L0,32);

Des_IP_1(位,strTmp);

BitToByte(strTmp,64,byte 8);

ByteToBCD(byte8,8,strDest);

}

其他

{

memset(字节8,0,sizeof(字节8));

BCDToByte(strKey,16,byte 8);

memset(bits,0,sizeof(位));

ByteToBit(字节8,8,位);

Des_GenSubKey(bits,subKey);

BCD tobyte(str RC,16,byte 8);

ByteToBit(字节8,8,位);

Des_IP(bits,strTmp);

memcpy(L0,strTmp,32);

memcpy(R0,strTmp 32,32);

for(I = 0;i16我)

{

memcpy(Lx,R0,32);

Des_F(R0,子密钥[15-i],Rx);

Do_XOR(L0,32,Rx);

memcpy(L0,Lx,32);

memcpy(R0,Rx,32);

}

memcpy(位,R0,32);

memcpy(位32,L0,32);

Des_IP_1(位,strTmp);

BitToByte(strTmp,64,byte 8);

ByteToBCD(byte8,8,strDest);

}

返回0;

}

//做3DES加密或解密。

int Do_3DES(char* strSrc,char* strKey,char* strDest,char flag)

{

无符号字符strBCDKey[32 1],strByteKey[16 1];

无符号字符strMidDest1[16 1],strmiddest 2[16 1];

无符号字符strLKey[16 1],strMKey[16 1],str rkey[16 1];

如果(!(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(str rkey));

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);

}

其他

{

memset(strBCDKey,0,sizeof(strBCDKey));

memcpy(strBCDKey,strKey,32);

memset(strLKey,0,sizeof(strLKey));

memcpy(strLKey,strBCDKey,16);

memset(strRKey,0,sizeof(str rkey));

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);

}

返回0;

}

Php 3des加密问题 3DES应通过DES加密进行解密。

?服务器端编程语言(Professional Hypertext Preprocessor的缩写)

$key = "这是一个密钥";

$input = "让我们9点在秘密地点见面。";

$ TD = mcrypt _ module _ open(' triple des ','',' 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 _ module _ close($ TD);

?服务器端编程语言(Professional Hypertext Preprocessor的缩写)

//.h

函数mdecrypt_3des($input,$key){

$ TD = MCRYPT _ module _ open(MCRYPT _ 3 des,'',MCRYPT_MODE_ECB,' ');

$ block size = 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);//密钥最长可达24位?

//返回urlencode(base64 _ encode(mcrypt _ generic($ TD,$ input));//加密

返回rtrim(mdecrypt_generic($td,base64_decode(urldecode($input)))," \ u 0008 ");//解密

}

这段代码复制过来,希望能解决你的问题。

如何用php解密3des ?服务器端编程语言(Professional Hypertext Preprocessor的缩写)

类别Crypt3Des {

var $ key

函数Crypt3Des($key){

$ this-key = $ key;

}

函数加密($input){

$ size = MCRYPT _ get _ block _ size(MCRYPT _ 3 des,' ECB ');

$input = $this-pkcs5_pad($input,$ size);

$key = str_pad($this-key,24,' 0 ');

$ TD = MCRYPT _ module _ open(MCRYPT _ 3 des,'',' 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 _ module _ close($ TD);

//$ data = base64 _ encode($ this-paddingpkcs 7($ data));

$ data = base64 _ encode($ data);

返回$ data

}

函数解密(加密){

$ encrypted = base64 _ decode($ encrypted);

$key = str_pad($this-key,24,' 0 ');

$ TD = MCRYPT _ module _ open(MCRYPT _ 3 des,'',' 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 _ module _ close($ TD);

$ y = $ this-pkcs 5 _ unpad($ decrypted);

返回$ y;

}

函数pkcs5_pad ($text,$blocksize) {

$ pad = $ blocksize-(strlen($ text)% $ blocksize);

返回$text。str_repeat(chr($pad),$ pad);

}

函数pkcs5_unpad($text){

$ pad = ord($ text { strlen($ text)-1 });

if ($pad strlen($text)) {

返回false

}

if (strspn($text,chr($pad),strlen($text) - $pad)!= $pad){

返回false

}

返回substr($text,0,-1 * $ pad);

}

函数paddingpcs 7($ data){

$ block _ size = MCRYPT _ get _ block _ size(MCRYPT _ 3 des,MCRYPT _ MODE _ CBC);

$ padding _ char = $ block _ size-(strlen($ data)% $ block _ size);

$data。= str_repeat(chr($padding_char),$ padding _ char);

返回$ data

}

}

用法:

$ crypt = new crypt 3 des(' key ');

$code = "加密字符串";

echo $ crypt-decrypt($ code);

Echo公布了结果。

Php的3des加密结果和java不一致。 这个我研究过一次。如果你有php段完整的加密源代码,还是有可能达到一致的结果的,否则会很困难,因为虽然都叫3des,但是里面有很多算法,比如php加密时是否使用向量等等。

相关文章

发表新评论