在完成一个大项目时候,我们要用到多语言来开发接口,每个模块可能分配到各小组中,各小组成员用到语言往往不一样,在向接口传递参数的时候,就要用到加密与解密。
在网上找了一些,这篇文章中有通用的写法,《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加密与解密所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)