首页 > 代码库 > PHP、JAVA、C#、Object-C 通用的DES加密

PHP、JAVA、C#、Object-C 通用的DES加密

 

PHP:

class JoDES {    private static $_instance = NULL;    /**     * @return JoDES     */    public static function share() {        if (is_null(self::$_instance)) {            self::$_instance = new JoDES();        }        return self::$_instance;    }    /**     * 加密     * @param string $str 要处理的字符串     * @param string $key 加密Key,为8个字节长度     * @return string     */    public function encode($str, $key) {        $size = mcrypt_get_block_size(MCRYPT_DES, MCRYPT_MODE_CBC);        $str = $this->pkcs5Pad($str, $size);        $aaa = mcrypt_cbc(MCRYPT_DES, $key, $str, MCRYPT_ENCRYPT, $key);        $ret = base64_encode($aaa);        return $ret;    }    /**     * 解密      * @param string $str 要处理的字符串     * @param string $key 解密Key,为8个字节长度     * @return string     */    public function decode($str, $key) {        $strBin = base64_decode($str);        $str = mcrypt_cbc(MCRYPT_DES, $key, $strBin, MCRYPT_DECRYPT, $key);        $str = $this->pkcs5Unpad($str);        return $str;    }    function hex2bin($hexData) {        $binDatahttp://www.mamicode.com/= "";        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);    }}

 

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, 0, 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, 0, 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 = http://www.mamicode.com/nil;"=" withString:@""];        NSData *encodedData = http://www.mamicode.com/[strBase64 dataUsingEncoding:NSASCIIStringEncoding];"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;}@end

 

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 = http://www.mamicode.com/decodeBase64(message);//convertHexString(message);"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, secretKey, 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 = http://www.mamicode.com/Integer.parseInt(byteString, 16);"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);	}}

  

 

PHP、JAVA、C#、Object-C 通用的DES加密