Golang、PHP、Java、C#、ObjectC互通DES加密与解密

Golang、PHP、Java、C#、ObjectC互通DES加密与解密,第1张

概述在完成一个大项目时候,我们要用到多语言来开发接口,每个模块可能分配到各小组中,各小组成员用到语言往往不一样,在向接口传递参数的时候,就要用到加密解密。 在网上找了一些,这篇文章中有通用的写法,《PHP、JAVA、C#、Object-C 通用的DES加密》。 我只对PHP和Golang加密与解密进行了修改,其它语言并没有修改! PHP: /** * @desc DES加密码与解密*/cla

在完成一个大项目时候,我们要用到多语言来开发接口,每个模块可能分配到各小组中,各小组成员用到语言往往不一样,在向接口传递参数的时候,就要用到加密与解密。

在网上找了一些,这篇文章中有通用的写法,《PHP、JAVA、C#、Object-C 通用的DES加密》。

我只对PHP和Golang加密与解密进行了修改,其它语言并没有修改!

PHP:

/** * @desc DES加密码与解密*/class Des {	//密钥8位	public $key = '256&#@$M';	/**	 * @desc 加密返回大写十六进制字符串	 * @param string $str	 * @return string	 */	public function encrypt($str) {		$size = mcrypt_get_block_size (MCRYPT_DES,MCRYPT_MODE_CBC);		$str = $this->pkcs5Pad($str,$size);		return strtoupper(bin2hex( mcrypt_encrypt(MCRYPT_DES,$this->key,$str,MCRYPT_MODE_CBC,$this->key)));	}	/**	 * @desc 解密	 * @param string $str	 * @return string	 */	public function decrypt($str) {		$strBin = $this->hex2bin(strtolower($str));		$str = mcrypt_decrypt(MCRYPT_DES,$strBin,$this->key);		$str = $this->pkcs5Unpad($str);		return $str;	}	 	public function hex2bin($hexData) {		$binData = '';		for($i = 0; $i < strlen ($hexData ); $i += 2) {			$binData .= chr(hexdec(substr($hexData,$i,2)));		}		return $binData;	}	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,-1 * $pad);	}	 }$obj = new DES();echo '<pre>';echo $str = $obj->encrypt('123456');echo '<br/>========================================<br/>';echo $obj->decrypt($str);

下面再介绍一下Golang的,这里有篇文章详细的介绍了《Go加密解密之AES》,并附有代码。

Golang:

package mainimport (	"bytes"	"crypto/cipher"	"crypto/des"	"enCoding/base64"	"fmt")func main() {	// DES 加解密	testDes()	// 3DES加解密	test3Des()}func testDes() {	key := []byte("256&#@$M")	result,err := DesEncrypt([]byte("123456"),key)	if err != nil {		panic(err)	}	fmt.Println(base64.StdEnCoding.EncodetoString(result))	hexstr := fmt.Sprintf("%X",result)	fmt.Println(hexstr)	origData,err := DesDecrypt(result,key)	if err != nil {		panic(err)	}	fmt.Println("=======")	fmt.Println(string(origData))}func test3Des() {	key := []byte("256&#@$MsefIEl#fi32lf3e!")	result,err := TripleDesEncrypt([]byte("123456"),key)	if err != nil {		panic(err)	}	fmt.Println(base64.StdEnCoding.EncodetoString(result))	origData,err := TripleDesDecrypt(result,key)	if err != nil {		panic(err)	}	fmt.Println(string(origData))}func DesEncrypt(origData,key []byte) ([]byte,error) {	block,err := des.NewCipher(key)	if err != nil {		return nil,err	}	origData = PKCS5padding(origData,block.BlockSize())	// origData = Zeropadding(origData,block.BlockSize())	blockMode := cipher.NewCBCEncrypter(block,key)	crypted := make([]byte,len(origData))	// 根据CryptBlocks方法的说明,如下方式初始化crypted也可以	// crypted := origData	blockMode.CryptBlocks(crypted,origData)	return crypted,nil}func DesDecrypt(crypted,err	}	blockMode := cipher.NewCBCDecrypter(block,key)	origData := make([]byte,len(crypted))	// origData := crypted	blockMode.CryptBlocks(origData,crypted)	origData = PKCS5Unpadding(origData)	// origData = ZeroUnpadding(origData)	return origData,nil}// 3DES加密func TripleDesEncrypt(origData,err := des.NewTripleDESCipher(key)	if err != nil {		return nil,key[:8])	crypted := make([]byte,len(origData))	blockMode.CryptBlocks(crypted,nil}// 3DES解密func TripleDesDecrypt(crypted,key[:8])	origData := make([]byte,nil}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.TrimRightFunc(origData,func(r rune) bool {		return r == rune(0)	})}func PKCS5padding(ciphertext []byte,blockSize int) []byte {	padding := blockSize - len(ciphertext)%blockSize	padtext := bytes.Repeat([]byte{byte(padding)},padtext...)}func PKCS5Unpadding(origData []byte) []byte {	length := len(origData)	// 去掉最后一个字节 unpadding 次	unpadding := int(origData[length-1])	return origData[:(length - unpadding)]}

其它几个版本的可以看一下《PHP、JAVA、C#、Object-C 通用的DES加密》

这里也顺便copy一下过来~

C#:

public class MyDes    {        /// <summary>        /// DES加密方法        /// </summary>        /// <param name="strPlain">明文</param>        /// <param name="strDESKey">密钥</param>        /// <param name="strDESIV">向量</param>        /// <returns>密文</returns>        public static string Encode(string source,string _DESKey)        {            StringBuilder sb = new StringBuilder();            using (DESCryptoServiceProvIDer des = new DESCryptoServiceProvIDer())            {                byte[] key = ASCIIEnCoding.ASCII.GetBytes(_DESKey);                byte[] iv = ASCIIEnCoding.ASCII.GetBytes(_DESKey);                byte[] dataByteArray = EnCoding.UTF8.GetBytes(source);                des.Mode = System.Security.Cryptography.CipherMode.CBC;                des.Key = key;                des.IV = iv;                string encrypt = "";                using (MemoryStream ms = new MemoryStream())                using (CryptoStream cs = new CryptoStream(ms,des.CreateEncryptor(),CryptoStreamMode.Write))                {                    cs.Write(dataByteArray,dataByteArray.Length);                    cs.FlushFinalBlock();                    encrypt = Convert.ToBase64String(ms.ToArray());                }                return encrypt;            }        }         /// <summary>        /// 进行DES解密。        /// </summary>        /// <param name="pToDecrypt">要解密的base64串</param>        /// <param name="sKey">密钥,且必须为8位。</param>        /// <returns>已解密的字符串。</returns>        public static string Decode(string source,string sKey)        {            byte[] inputByteArray = System.Convert.FromBase64String(source);//EnCoding.UTF8.GetBytes(source);            using (DESCryptoServiceProvIDer des = new DESCryptoServiceProvIDer())            {                des.Key = ASCIIEnCoding.ASCII.GetBytes(sKey);                des.IV = ASCIIEnCoding.ASCII.GetBytes(sKey);                System.IO.MemoryStream ms = new System.IO.MemoryStream();                using (CryptoStream cs = new CryptoStream(ms,des.CreateDecryptor(),CryptoStreamMode.Write))                {                    cs.Write(inputByteArray,inputByteArray.Length);                    cs.FlushFinalBlock();                    cs.Close();                }                string str = EnCoding.UTF8.GetString(ms.ToArray());                ms.Close();                return str;            }        }    }

Object C:

/***  JoDes.h ***/ #import <Foundation/Foundation.h>#import <CommonCrypto/CommonDigest.h>#import <CommonCrypto/CommonCryptor.h> @interface JoDes : NSObject + (Nsstring *) encode:(Nsstring *)str key:(Nsstring *)key;+ (Nsstring *) decode:(Nsstring *)str key:(Nsstring *)key; @end  /***  JoDes.m ***/////  XLEncrytHelper.m//  NewHoldGold////  Created by 梁鑫磊 on 13-12-27.//  copyright (c) 2013年 zsgJs. All rights reserved.// #import "JoDes.h" @interface JoDes() + (Nsstring *) encodeBase64WithString:(Nsstring *)strData;+ (Nsstring *) encodeBase64WithData:(NSData *)objData;+ (NSData *) decodeBase64WithString:(Nsstring *)strBase64; + (Nsstring *)doCipher:(Nsstring *)sTextIn key:(Nsstring *)sKey                  context:(Ccoperation)encryptOrDecrypt; @end @implementation JoDes + (Nsstring *) encode:(Nsstring *)str key:(Nsstring *)key{    // doCipher 不能编汉字,所以要进行 url encode    NSMutableString* str1 = [JoDes urlEncode:str];    NSMutableString* encode = [NSMutableString stringWithString:[JoDes doCipher:str1 key:key context:kCCEncrypt]];    [JoDes formatSpecialCharacters:encode];    return encode;} + (Nsstring *) decode:(Nsstring *)str key:(Nsstring *)key{    NSMutableString *str1 = [NSMutableString stringWithString:str];    [JoDes reformatSpecialCharacters:str1];    Nsstring *rt = [JoDes doCipher:str1 key:key context:kCCDecrypt];    return rt;} + (NSMutableString *)urlEncode:(Nsstring*)str{    NSMutableString* encodeStr = [NSMutableString stringWithString:[str stringByAddingPercentEscapesUsingEnCoding:NSUTF8StringEnCoding]];    [encodeStr replaceOccurrencesOfString:@"+" withString:@"%2B" options:NSWIDthInsensitiveSearch range:NSMakeRange(0,[encodeStr length])];    [encodeStr replaceOccurrencesOfString:@"/" withString:@"%2F" options:NSWIDthInsensitiveSearch range:NSMakeRange(0,[encodeStr length])];    return encodeStr;} + (voID)formatSpecialCharacters:(NSMutableString *)str{    [str replaceOccurrencesOfString:@"+" withString:@"$$" options:NSWIDthInsensitiveSearch range:NSMakeRange(0,[str length])];    [str replaceOccurrencesOfString:@"/" withString:@"@@" options:NSWIDthInsensitiveSearch range:NSMakeRange(0,[str length])];}  + (voID)reformatSpecialCharacters:(NSMutableString *)str{    [str replaceOccurrencesOfString:@"$$" withString:@"+" options:NSWIDthInsensitiveSearch range:NSMakeRange(0,[str length])];    [str replaceOccurrencesOfString:@"@@" withString:@"/" options:NSWIDthInsensitiveSearch range:NSMakeRange(0,[str length])];} + (Nsstring *)encodeBase64WithString:(Nsstring *)strData {    return [JoDes encodeBase64WithData:[strData dataUsingEnCoding:NSUTF8StringEnCoding]];}  + (Nsstring *)encodeBase64WithData:(NSData *)objData {    Nsstring *enCoding = nil;    unsigned char *enCodingBytes = NulL;    @try {        static char enCodingtable[64] = "ABCDEFGHIJKLMnopQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";        static NSUInteger paddingtable[] = {0,2,1};                 NSUInteger dataLength = [objData length];        NSUInteger encodedBlocks = (dataLength * 8) / 24;        NSUInteger padding = paddingtable[dataLength % 3];        if( padding > 0 ) encodedBlocks++;        NSUInteger encodedLength = encodedBlocks * 4;                 enCodingBytes = malloc(encodedLength);        if( enCodingBytes != NulL ) {            NSUInteger rawBytestoprocess = dataLength;            NSUInteger rawBaseIndex = 0;            NSUInteger enCodingBaseIndex = 0;            unsigned char *rawBytes = (unsigned char *)[objData bytes];            unsigned char rawByte1,rawByte2,rawByte3;            while( rawBytestoprocess >= 3 ) {                rawByte1 = rawBytes[rawBaseIndex];                rawByte2 = rawBytes[rawBaseIndex+1];                rawByte3 = rawBytes[rawBaseIndex+2];                enCodingBytes[enCodingBaseIndex] = enCodingtable[((rawByte1 >> 2) & 0x3F)];                enCodingBytes[enCodingBaseIndex+1] = enCodingtable[((rawByte1 << 4) & 0x30) | ((rawByte2 >> 4) & 0x0F) ];                enCodingBytes[enCodingBaseIndex+2] = enCodingtable[((rawByte2 << 2) & 0x3C) | ((rawByte3 >> 6) & 0x03) ];                enCodingBytes[enCodingBaseIndex+3] = enCodingtable[(rawByte3 & 0x3F)];                                 rawBaseIndex += 3;                enCodingBaseIndex += 4;                rawBytestoprocess -= 3;            }            rawByte2 = 0;            switch (dataLength-rawBaseIndex) {                case 2:                    rawByte2 = rawBytes[rawBaseIndex+1];                case 1:                    rawByte1 = rawBytes[rawBaseIndex];                    enCodingBytes[enCodingBaseIndex] = enCodingtable[((rawByte1 >> 2) & 0x3F)];                    enCodingBytes[enCodingBaseIndex+1] = enCodingtable[((rawByte1 << 4) & 0x30) | ((rawByte2 >> 4) & 0x0F) ];                    enCodingBytes[enCodingBaseIndex+2] = enCodingtable[((rawByte2 << 2) & 0x3C) ];                    // we can skip rawByte3 since we have a partial block it would always be 0                    break;            }            // compute location from where to begin inserting padding,it may overwrite some bytes from the partial block enCoding            // if their value was 0 (cases 1-2).            enCodingBaseIndex = encodedLength - padding;            while( padding-- > 0 ) {                enCodingBytes[enCodingBaseIndex++] = '=';            }            enCoding = [[Nsstring alloc] initWithBytes:enCodingBytes length:encodedLength enCoding:NSASCIIStringEnCoding];        }    }    @catch (NSException *exception) {        enCoding = nil;        NSLog(@"WARNING: error occured while tring to encode base 32 data: %@",exception);    }    @finally {        if( enCodingBytes != NulL ) {            free( enCodingBytes );        }    }    return enCoding;     } + (NSData *)decodeBase64WithString:(Nsstring *)strBase64 {    NSData *data = nil;    unsigned char *decodedBytes = NulL;    @try {#define __ 255        static char deCodingtable[256] = {            __,__,// 0x00 - 0x0F            __,// 0x10 - 0x1F            __,62,63,// 0x20 - 0x2F            52,53,54,55,56,57,58,59,60,61,// 0x30 - 0x3F            __,1,3,4,5,6,7,8,9,10,11,12,13,14,// 0x40 - 0x4F            15,16,17,18,19,20,21,22,23,24,25,// 0x50 - 0x5F            __,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,// 0x60 - 0x6F            41,42,43,44,45,46,47,48,49,50,51,// 0x70 - 0x7F            __,// 0x80 - 0x8F            __,// 0x90 - 0x9F            __,// 0xA0 - 0xAF            __,// 0xB0 - 0xBF            __,// 0xC0 - 0xCF            __,// 0xD0 - 0xDF            __,// 0xE0 - 0xEF            __,// 0xF0 - 0xFF        };        strBase64 = [strBase64 stringByReplacingOccurrencesOfString:@"=" withString:@""];        NSData *encodedData = [strBase64 dataUsingEnCoding:NSASCIIStringEnCoding];        unsigned char *encodedBytes = (unsigned char *)[encodedData bytes];                 NSUInteger encodedLength = [encodedData length];        NSUInteger encodedBlocks = (encodedLength+3) >> 2;        NSUInteger expectedDataLength = encodedBlocks * 3;                 unsigned char deCodingBlock[4];                 decodedBytes = malloc(expectedDataLength);        if( decodedBytes != NulL ) {                         NSUInteger i = 0;            NSUInteger j = 0;            NSUInteger k = 0;            unsigned char c;            while( i < encodedLength ) {                c = deCodingtable[encodedBytes[i]];                i++;                if( c != __ ) {                    deCodingBlock[j] = c;                    j++;                    if( j == 4 ) {                        decodedBytes[k] = (deCodingBlock[0] << 2) | (deCodingBlock[1] >> 4);                        decodedBytes[k+1] = (deCodingBlock[1] << 4) | (deCodingBlock[2] >> 2);                        decodedBytes[k+2] = (deCodingBlock[2] << 6) | (deCodingBlock[3]);                        j = 0;                        k += 3;                    }                }            }                         // Process left over bytes,if any            if( j == 3 ) {                decodedBytes[k] = (deCodingBlock[0] << 2) | (deCodingBlock[1] >> 4);                decodedBytes[k+1] = (deCodingBlock[1] << 4) | (deCodingBlock[2] >> 2);                k += 2;            } else if( j == 2 ) {                decodedBytes[k] = (deCodingBlock[0] << 2) | (deCodingBlock[1] >> 4);                k += 1;            }            data = [[NSData alloc] initWithBytes:decodedBytes length:k];        }    }    @catch (NSException *exception) {        data = nil;        NSLog(@"WARNING: error occured while deCoding base 32 string: %@",exception);    }    @finally {        if( decodedBytes != NulL ) {            free( decodedBytes );        }    }    return data;     }  + (Nsstring *)doCipher:(Nsstring *)sTextIn key:(Nsstring *)sKey                  context:(Ccoperation)encryptOrDecrypt {    nsstringencoding EnC = NSUTF8StringEnCoding;         NSMutableData *dTextIn;    if (encryptOrDecrypt == kCCDecrypt) {        dTextIn = [[JoDes decodeBase64WithString:sTextIn] mutablecopy];    }    else{        dTextIn = [[sTextIn dataUsingEnCoding: EnC] mutablecopy];    }    NSMutableData * dKey = [[sKey dataUsingEnCoding:EnC] mutablecopy];    [dKey setLength:kCCBlockSizeDES];    uint8_t *bufferPtr1 = NulL;    size_t bufferPtrSize1 = 0;    size_t movedBytes1 = 0;    //uint8_t iv[kCCBlockSizeDES];    //memset((voID *) iv,0x0,(size_t) sizeof(iv));    //    Byte iv[] = {0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF};    bufferPtrSize1 = ([sTextIn length] + kCCKeySizeDES) & ~(kCCKeySizeDES -1);    bufferPtr1 = malloc(bufferPtrSize1 * sizeof(uint8_t));    memset((voID *)bufferPtr1,0x00,bufferPtrSize1);         CCCrypt(encryptOrDecrypt,// Ccoperation op            kCCAlgorithmDES,// CCAlgorithm alg            kCcoptionPKCS7padding,// Ccoptions options            [dKey bytes],// const voID *key            [dKey length],// size_t keyLength //            [dKey bytes],// const voID *iv            [dTextIn bytes],// const voID *dataIn            [dTextIn length],// size_t dataInLength            (voID *)bufferPtr1,// voID *dataOut            bufferPtrSize1,// size_t dataOutAvailable            &movedBytes1);         //[dTextIn release];    //[dKey release];         Nsstring * sResult;    if (encryptOrDecrypt == kCCDecrypt){        sResult = [[Nsstring alloc] initWithData:[NSData dataWithBytes:bufferPtr1 length:movedBytes1] enCoding:EnC];        free(bufferPtr1);    }    else {        NSData *dResult = [NSData dataWithBytes:bufferPtr1 length:movedBytes1];        free(bufferPtr1);        sResult = [JoDes encodeBase64WithData:dResult];    }    return sResult;}

Java:

package com.example.aric.test; import javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.DESKeySpec;import javax.crypto.spec.IvParameterSpec; import androID.util.Base64; public class DES {     public final static String DES_KEY_STRING = "ABSuJsuu";         public static String encrypt(String message,String key) throws Exception {        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5padding");         DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");        SecretKey secretKey = keyFactory.generateSecret(desKeySpec);        IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));        cipher.init(Cipher.ENCRYPT_MODE,secretKey,iv);         return encodeBase64(cipher.doFinal(message.getBytes("UTF-8")));    }     public static String decrypt(String message,String key) throws Exception {         byte[] bytesrc = decodeBase64(message);//convertHexString(message);        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5padding");        DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");        SecretKey secretKey = keyFactory.generateSecret(desKeySpec);        IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));         cipher.init(Cipher.DECRYPT_MODE,iv);         byte[] retByte = cipher.doFinal(bytesrc);        return new String(retByte);    }     public static byte[] convertHexString(String ss) {        byte digest[] = new byte[ss.length() / 2];        for (int i = 0; i < digest.length; i++) {            String byteString = ss.substring(2 * i,2 * i + 2);            int byteValue = Integer.parseInt(byteString,16);            digest[i] = (byte) byteValue;        }         return digest;    }     public static String toHexString(byte b[]) {        StringBuffer hexString = new StringBuffer();        for (int i = 0; i < b.length; i++) {            String plainText = Integer.toHexString(0xff & b[i]);            if (plainText.length() < 2)                plainText = "0" + plainText;            hexString.append(plainText);        }         return hexString.toString();    }          public static String encodeBase64(byte[] b) {        return Base64.encodetoString(b,Base64.DEFAulT);    }         public static byte[] decodeBase64(String base64String) {        return Base64.decode(base64String,Base64.DEFAulT);    }}
总结

以上是内存溢出为你收集整理的Golang、PHP、Java、C#、ObjectC互通DES加密与解密全部内容,希望文章能够帮你解决Golang、PHP、Java、C#、ObjectC互通DES加密与解密所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1283698.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存