java+tripledes+ecb_TripleDES加密解密

本文介绍了对称加密中的TripleDES算法,重点讨论了Java实现的TripleDES加密和解密过程,包括ECB模式,以及C#和PHP的实现示例。
摘要由CSDN通过智能技术生成

对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码)。因此,通信双方都必须获得这把钥匙,并保持钥匙的秘密。

单钥密码系统的安全性依赖于以下两个因素:

第一、加密算法必须是足够强的,仅仅基于密文本身去解密信息在实践上是不可能的。

第二、加密方法的安全性依赖于密钥的秘密性,而不是算法的秘密性,因此,我们没有必要确保算法的秘密性(事实上,现实中使用的很多单钥密码系统的算法都是公开的),但是我们一定要保证密钥的秘密性。

DES(Data Encryption Standard)和TripleDES是对称加密的两种实现。

DES和TripleDES基本算法一致,只是TripleDES算法提供的key位数更多,加密可靠性更高。

DES使用的密钥key为8字节,初始向量IV也是8字节。

TripleDES使用24字节的key,初始向量IV也是8字节。

两种算法都是以8字节为一个块进行加密,一个数据块一个数据块的加密,一个8字节的明文加密后的密文也是8字节。如果明文长度不为8字节的整数倍,添加值为0的字节凑满8字节整数倍。所以加密后的密文长度一定为8字节的整数倍。

TripleDES加密:

///

///TripleDES 加密///

///

///

///

private static string DesEncrypt(string toEncrypt, stringkey) {var toEncryptArray =Encoding.UTF8.GetBytes(toEncrypt);var keyArray =Convert.FromBase64String(key);

TripleDESCryptoServiceProvider tdes= newTripleDESCryptoServiceProvider {

Key=keyArray,

Mode=CipherMode.ECB,

Padding=PaddingMode.PKCS7

};

ICryptoTransform cTransform=tdes.CreateEncryptor();byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

tdes.Clear();return Convert.ToBase64String(resultArray, 0, resultArray.Length);

}

TripleDES解密:

///

///TripleDES解密///

///

///

///

public static string DesDecrypt(string toDecrypt, stringkey) {try{//先base64解密 因为加密的时候最后走了一道base64加密

var enBytes =Convert.FromBase64String(toDecrypt);var keyArray =Convert.FromBase64String(key);

TripleDESCryptoServiceProvider tdes= newTripleDESCryptoServiceProvider {

Key=keyArray,

Mode=CipherMode.ECB,

Padding=PaddingMode.PKCS7

};

ICryptoTransform cTransform=tdes.CreateDecryptor();byte[] resultArray = cTransform.TransformFinalBlock(enBytes, 0, enBytes.Length);

tdes.Clear();returnEncoding.UTF8.GetString(resultArray);

}catch{return "";

}

}

c#具体实现如下:

usingSystem;usingSystem.Security.Cryptography;usingSystem.Text;namespaceTripleDes

{classProgram

{static void Main(string[] args)

{//加密的字符串

string source = "Happy Father's Day!";//用来加密的key 但是最终用在des加密的key//是这个key的 md5 hash

string sourceKey = "home";//获取原始key值的 md5 hash

byte[] keyBytes =GetKeyMd5Hash(sourceKey);string encryptedStr =DesEncrypt(source, keyBytes);

Console.WriteLine("encrypted string:"+encryptedStr);string decryptedStr =DesDecrypt(encryptedStr, keyBytes);

Console.WriteLine("Decrypted String:" +decryptedStr);

Console.ReadKey();

}///

///获取加密key的 md5 hash,最终DES加密的时候使用这个hash值///

/// 原始key值

///

public static byte[] GetKeyMd5Hash(stringkey)

{

MD5CryptoServiceProvider hashmd5= newMD5CryptoServiceProvider();byte[] keyBytes =hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));

hashmd5.Clear();returnkeyBytes;

}///

///TripleDES 加密///

///

///

///

public static string DesEncrypt(string toEncrypt, byte[] privateKey)

{byte[] toEncryptArray =UTF8Encoding.UTF8.GetBytes(toEncrypt);

TripleDESCryptoServiceProvider tdes= newTripleDESCryptoServiceProvider

{

Key=privateKey,

Mode=CipherMode.ECB,

Padding=PaddingMode.PKCS7

};

ICryptoTransform cTransform=tdes.CreateEncryptor();byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

tdes.Clear();return Convert.ToBase64String(resultArray, 0, resultArray.Length);

}///

///TripleDES解密///

///

///

///

public static string DesDecrypt(string toDecrypt, byte[] privateKey)

{//先base64解密 因为加密的时候最后走了一道base64加密

byte[] enBytes =Convert.FromBase64String(toDecrypt);

TripleDESCryptoServiceProvider tdes= newTripleDESCryptoServiceProvider

{

Key=privateKey,

Mode=CipherMode.ECB,

Padding=PaddingMode.PKCS7

};

ICryptoTransform cTransform=tdes.CreateDecryptor();byte[] resultArray = cTransform.TransformFinalBlock(enBytes, 0, enBytes.Length);

tdes.Clear();returnEncoding.UTF8.GetString(resultArray);

}

}

}

PHP实现如下:

{//Pad for PKCS7

$blockSize = mcrypt_get_block_size('tripledes', 'ecb');

$len=strlen($data);

$pad= $blockSize - ($len %$blockSize);

$data .=str_repeat(chr($pad), $pad);

$key= "home";

$key=md5($key,TRUE);

$key .= substr($key,0,8); //comment this if you use 168 bits long key//Encrypt data

$encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb');returnbase64_encode($encData);

}/*TripleDES解密*/function DesDecrypt($data)

{

$key= "home";

$key=md5($key, TRUE);

$key .= substr($key, 0, 8);//Decrypt data

$fromBase64Str =base64_decode($data);

$decData= mcrypt_decrypt('tripledes', $key, $fromBase64Str, 'ecb');return$decData;

}/*测试*/$encryptStr= DesEncrypt("Happy Father's Day!");

echo"encrypted string: $encryptStr";

$decryptStr=DesDecrypt($encryptStr);

echo"decrypted string: $decryptStr";?>

js加密:

functiondesEncrypt(str, key){

key=CryptoJS.enc.Base64.parse(key);//Triple DES 加密

var encrypted =CryptoJS.TripleDES.encrypt(str, key, {

mode: CryptoJS.mode.ECB,

padding: CryptoJS.pad.Pkcs7

});//转换为字符串

return encrypted =encrypted.toString();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值