Home  >  Article  >  Backend Development  >  JAVA、PHP、C#Object-C 通用的DES加密解密

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

WBOY
WBOYOriginal
2016-06-13 12:28:25713browse

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

JAVA、Android:

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, 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 = 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);    }}

?

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) {        $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);    }}

?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 Mr.Liao on 2016-01-22.//  Copyright (c) 2016年 Nomanland. 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,__,__, __, 0,__,__,  // 0x30 - 0x3F            __, 0, 1, 2,  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;} @end

?

?

?

?

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn