您的位置:首页 > 编程语言 > PHP开发

C#/JAVA/PHP 互通DES加解密算法(ECB模式支持8位)

2016-06-28 12:51 633 查看
C#代码:

using System;
using System.IO;
using System.Text;
using System.Globalization;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Diagnostics;

namespace ConsoleAPI
{
class Program
{
static void Main(string[] args)
{
//密钥8位,不足8位则用数字0补齐
string key = "12345678";

//待加密字符串
string s1 = "1";

//加密
string s2 = DesEncrypt(s1, key);

//解密
string s3 = DesDecrypt("g6AtgJul6q0=", key);

//加密、解密输出
Debug.WriteLine("加密前:" + s1);
Debug.WriteLine("加密后:" + s2);
Debug.WriteLine("解密后:" + s3);
}

///
/// 加密字符串
///
/// 明文
/// 密钥
///
static string DesEncrypt(string strText, string encryptKey)
{
string outString = "";
byte[] byKey = null;
byte[] IV = Encoding.Default.GetBytes(encryptKey);
try
{
byKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, encryptKey.Length));
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
des.Mode = CipherMode.ECB;
byte[] inputByteArray = Encoding.UTF8.GetBytes(strText);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
outString = Convert.ToBase64String(ms.ToArray());
}
catch (System.Exception)
{
outString = "";
}
return outString;
}

///
/// 解密字符串
///
/// 密文
/// 密钥
///
static string DesDecrypt(string strText, string decryptKey)
{
string outString = "";
byte[] byKey = null;
byte[] IV = Encoding.Default.GetBytes(decryptKey);
byte[] inputByteArray = new Byte[strText.Length];
try
{
byKey = System.Text.Encoding.UTF8.GetBytes(decryptKey.Substring(0, decryptKey.Length));
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
des.Mode = CipherMode.ECB;
inputByteArray = Convert.FromBase64String(strText);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(byKey, IV), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
System.Text.Encoding encoding = new System.Text.UTF8Encoding();
outString = encoding.GetString(ms.ToArray());
}
catch (System.Exception)
{
outString = "";
}
return outString;
}
}
}


Java代码:

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.security.SecureRandom;
import java.util.Map;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;

public class Encrypt {
/**
* @param args
*/
public static void main(String[] args) {

//待加密内容
String str = "1";
//密码8位,不足8位则用数字0补齐
String password = "12345678";

//DES加密
byte[] result = Encrypt.desCrypto(str.getBytes(),password);
System.out.println("DES加密后内容为:"+new String(result));
//Base64加密
byte[] b = Base64.encodeBase64(result, true);
System.out.println("Base64加密后内容为:"+new String(b));

//Base64解密
byte[] bb = Base64.decodeBase64(b);
System.out.println("Base64解密后内容为:"+new String(bb));
//DES解密
try {
byte[] decryResult = Encrypt.decrypt(bb, password);
System.out.println("DES解密后内容为:"+new String(decryResult));
} catch (Exception e1) {
e1.printStackTrace();
}
}

public static String encrypt(String srcMsg, String key){
//DES加密
byte[] result = Encrypt.desCrypto(srcMsg.getBytes(), key);
//Base64编码
byte[] resultBase = Base64.encodeBase64(result, true);

return new String(resultBase);
}
private static byte[] desCrypto(byte[] datasource, String password) {
try {
SecureRandom random = new SecureRandom();
DESKeySpec desKey = new DESKeySpec(password.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey securekey = keyFactory.generateSecret(desKey);
// Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance("DES");
// 用密匙初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE, securekey, random);
// 现在,获取数据并加密
// 正式执行加密操作
return cipher.doFinal(datasource);
} catch (Throwable e) {
e.printStackTrace();
}
return null;
}
private static byte[] decrypt(byte[] src, String password) throws Exception {
// DES算法要求有一个可信任的随机数源
SecureRandom random = new SecureRandom();
// 创建一个DESKeySpec对象
DESKeySpec desKey = new DESKeySpec(password.getBytes());
// 创建一个密匙工厂
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
// 将DESKeySpec对象转换成SecretKey对象
SecretKey securekey = keyFactory.generateSecret(desKey);
// Cipher对象实际完成解密操作
Cipher cipher = Cipher.getInstance("DES");
// 用密匙初始化Cipher对象
cipher.init(Cipher.DECRYPT_MODE, securekey, random);
// 真正开始解密操作
return cipher.doFinal(src);
}
}


Php代码:

<?php
/**
* 加密和解密
* 加密解密时使用的$key的前8位(不足8位则以0补齐)
*/

class encrypt {
/**
* 加密
* @param  string $str 待加密的字符串
* @param  string $key 密码
* @return string
*/
public function encode($str, $key) {
$key = substr($key, 0, 8);
$iv = $key;
$size = mcrypt_get_block_size ( MCRYPT_DES, MCRYPT_MODE_ECB );
$str = $this->pkcs5Pad ( $str, $size );
$s = mcrypt_encrypt(MCRYPT_DES,$key,$str,MCRYPT_MODE_ECB,$iv);
return base64_encode($s);
}

/**
* 解密
* @param  string $str 待解密的字符串
* @param  string $key 密码
* @return string
*/
public function decode($str, $key) {
$iv = $key;
$str = base64_decode($str);
$str = mcrypt_decrypt( MCRYPT_DES, $key, $str, MCRYPT_MODE_ECB, $iv );
$str = $this->pkcs5Unpad( $str );
return $str;
}

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

public function pkcs5Unpad($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 );
}
}

/* 测试加密和解密 */
$encrypt = new encrypt();
echo $encrypt->encode('1', '12345678');
echo '';
echo $encrypt->decode('g6AtgJul6q0=', '12345678');
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c# java php des加解密