2021-08-21 来源:华纳网 责任编辑:王双双 人气:
核心提示:知识点: 基于DES算法的加解密 本课内容: 大家好,欢迎来到谷雨课堂, 前几课我们讲了基于的编码、解码, 本节我们来实践一下DES加解密, DES算法,在很多领域都有应用, 比如微信公众号的授权认证、 某些公交IC的数据交换认证 用的都是的DES算法。

知识点:

基于DES算法的加解密
 

 

本课内容:

大家好,欢迎来到谷雨课堂,

前几课我们讲了基于的编码、解码,

本节我们来实践一下DES加解密,

DES算法,在很多领域都有应用,

比如微信公众号的授权认证、

某些公交IC的数据交换认证

用的都是的DES算法。

 

那么本节谷雨老师用Go来实现DES的加解密,

做为全平台的应用,

谷雨老师同时也提供了PHP、.Net、Java/Android

全兼容的DES加解密代码

 

Go版

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
package main
import ("bytes""crypto/cipher""crypto/des""encoding/base64""log")
const DES_KEY = "abcdabcd"
func ZeroPadding(ciphertext []byte, blockSize int) []byte {  padding := blockSize - len(ciphertext)%blockSize  padtext := bytes.Repeat([]byte{0}, padding)return append(ciphertext, padtext...)}
func ZeroUnPadding(origData []byte) []byte {return bytes.TrimFunc(origData,func(r rune) bool {return r == rune(0)    })}
func DesEncode(s string) string {  data := []byte(s)  keyByte := []byte(DES_KEY)  block, err := des.NewCipher(keyByte)if err != nil {panic(err)  }  data = PKCS5Padding(data, block.BlockSize())//获取CBC加密模式  iv := keyByte //用密钥作为向量(不建议这样使用)  mode := cipher.NewCBCEncrypter(block, iv)  out := make([]byte, len(data))  mode.CryptBlocks(out, data)return base64.StdEncoding.EncodeToString(out)
}
//明文补码算法func PKCS5Padding(ciphertext []byte, blockSize int) []byte {  padding := blockSize - len(ciphertext)%blockSize  padtext := bytes.Repeat([]byte{byte(padding)}, padding)return append(ciphertext, padtext...)}
//明文减码算法func PKCS5UnPadding(origData []byte) []byte {  length := len(origData)  unpadding := int(origData[length-1])return origData[:(length - unpadding)]}
func DesDecode(s string) string {  keyByte := []byte(DES_KEY)  data, err := base64.StdEncoding.DecodeString(s)if err != nil {panic(err)  }  block, err := des.NewCipher(keyByte)if err != nil {panic(err)  }  iv := keyByte //用密钥作为向量(不建议这样使用)  mode := cipher.NewCBCDecrypter(block, iv)  plaintext := make([]byte, len(data))  mode.CryptBlocks(plaintext, data)  plaintext = PKCS5UnPadding(plaintext)return string(plaintext)}
func main() {  s1 := DesEncode("谷雨课堂,666!")  log.Println(s1)  s2 := DesDecode(s1)  log.Println(s2)}

 

 

.Net版本

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
public static string Encode(string encryStr, string key){byte[] rgbKey = Encoding.UTF8.GetBytes(key);byte[] rgbIV = Encoding.UTF8.GetBytes(key);byte[] inputByteArray = Encoding.UTF8.GetBytes(encryStr);
            DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();using (MemoryStream mStream = new MemoryStream())            {using (CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write))                {                    cStream.Write(inputByteArray, 0, inputByteArray.Length);                    cStream.FlushFinalBlock();byte[] srteamArray = mStream.ToArray();                    mStream.Close();                    mStream.Dispose();return Convert.ToBase64String(srteamArray);                }            }
        }

public static string Decode(string decryStr, string key)        {byte[] rgbKey = Encoding.UTF8.GetBytes(key);byte[] rgbIV = Encoding.UTF8.GetBytes(key);byte[] inputByteArray = Convert.FromBase64String(decryStr);
            DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();using (MemoryStream mStream = new MemoryStream())            {using (CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write))                {                    cStream.Write(inputByteArray, 0, inputByteArray.Length);                    cStream.FlushFinalBlock();byte[] srteamArray = mStream.ToArray();                    mStream.Close();                    mStream.Dispose();return Encoding.UTF8.GetString(srteamArray);                }            }        }

 

PHP版本

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
class YsDesUtils{var $key="abcdabcd";var $iv="abcdabcd";  
//加密function encrypt($str){               $size = @mcrypt_get_block_size( MCRYPT_DES, MCRYPT_MODE_CBC );        $str = $this->Pkcs5Pad( $str, $size );
///$data=mcrypt_cbc(MCRYPT_DES, $this->key, $str, MCRYPT_ENCRYPT, $this->iv);        $data = @mcrypt_encrypt(MCRYPT_DES,$this->key, $str,  "cbc", $this->iv);return base64_encode($data);    }
//解密function decrypt($str){        $str = base64_decode ($str);        $str = @mcrypt_decrypt(MCRYPT_DES, $this->key, $str, "cbc", $this->iv );        $str = $this->pkcs5Unpad( $str );return $str;    }
function hex2bin($hexData){        $binData = "";for($i = 0; $i < strlen ( $hexData ); $i += 2)        {            $binData .= chr(hexdec(substr($hexData, $i, 2)));        }return $binData;    }
function pkcs5Pad($text, $blocksize){        $pad = $blocksize - (strlen ( $text ) % $blocksize);return $text . str_repeat ( chr ( $pad ), $pad );    }
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 );    }}
$str = "谷雨课堂,666!"$crypt = new YsDesUtils();$mstr = $crypt->encrypt($str);echo "<hr>".$mstr;$str = $crypt->decrypt($mstr);echo "<hr>".$str;

 

Java/Android版

 

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
import android.util.Base64;import javax.crypto.Cipher;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;
public class YsDesUtils {
public static String Encode(String encryptString,String encryptKey){try {byte[] bytes = encryptKey.getBytes();            IvParameterSpec zeroIv=new IvParameterSpec(bytes);            SecretKeySpec key =new SecretKeySpec(bytes,"DES");            Cipher cipher=Cipher.getInstance("DES/CBC/PKCS7Padding");//PKCS5Padding            cipher.init(Cipher.ENCRYPT_MODE,key,zeroIv);byte[]encryptedData=cipher.doFinal(encryptString.getBytes());return Base64.encodeToString(encryptedData,0);        } catch (Exception e) {            System.out.println("DESUtils::encryptDES:"+e.fillInStackTrace());        }return "";    }
public static String Decode(String decryptString,String decryptKey){try {byte[] bytes = decryptKey.getBytes();byte[]byteMi=Base64.decode(decryptString,0);            IvParameterSpec zeroIv=new IvParameterSpec(bytes);            SecretKeySpec key=new SecretKeySpec(bytes,"DES");            Cipher cipher=Cipher.getInstance("DES/CBC/PKCS7Padding");            cipher.init(Cipher.DECRYPT_MODE,key,zeroIv);    byte [] decryptedData=cipher.doFinal(byteMi);return new String(decryptedData);        } catch (Exception e) {            System.out.println("DESUtils::decryptDES:"+e.fillInStackTrace());        }return null;    }
}

 

扩展阅读:

DES全称为Data Encryption Standard,

即数据加密标准,

是一种使用密钥加密的块算法。

 

DES的原始思想可以参照二战德国的恩格玛机,

其基本思想大致相同。

传统的密码加密都是由古代的循环移位思想而来,

恩格玛机在这个基础之上进行了扩散模糊。

但是本质原理都是一样的。

现代DES在二进制级别做着同样的事:

替代模糊,增加分析的难度。 

 

DES是一个分组加密算法,

它以64位为分组对数据加密。

64位一组的明文从算法的一端输入,

64位的密文从另一端输出。

DES是一个对称算法:

加密和解密用的是同一算法。

密钥的长度为56位。

密钥通常表示为64位的数,

但每个第8位都用作奇偶校验,

可以忽略,

但写程序时为了统一,

还是采用64位密钥,

但经过密钥置换操作后,

就会去除掉其中的奇偶校验位

密钥可以是任意的56位的数,

且可在任意的时候改变。

其中极少量的数被认为是弱密钥,

但能容易地避开它们。

所有的保密性依赖于密钥。

 

完整的源代码可以登录【华纳网】下载。

 

https://www.worldwarner.com/






 





免责声明:本文仅代表作者个人观点,与华纳网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。