0

0

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

php中文网

php中文网

发布时间:2016-06-13 12:28:25

|

857人浏览过

|

来源于php中文网

原创

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    {        ///         /// DES加密方法        ///         /// 明文        /// 密钥        /// 向量        /// 密文        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;            }        }        ///         /// 进行DES解密。        ///         /// 要解密的base64串        /// 密钥,且必须为8位。        /// 已解密的字符串。        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 #import #import @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

?

?

?

?

Sologo AI
Sologo AI

SologoAI 是一款AI在线LOGO生成工具,帮助用户快速创建独特且专业的品牌标识和配套VI设计。

下载

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
微信文件过期恢复教程
微信文件过期恢复教程

本专题整合了微信文件过期恢复方法、技巧教程,阅读专题下面的文章了解更多详细内容。

0

2026.02.04

抖音网页版入口与视频观看指南 抖音官网视频在线访问
抖音网页版入口与视频观看指南 抖音官网视频在线访问

本专题汇总了抖音网页版的入口链接、官方登录页面以及视频观看入口,帮助用户快速访问抖音网页版,提供免登录访问方式和直接进入视频播放页面的方法,确保顺利浏览和观看抖音视频。

63

2026.02.04

学习通网页版入口与在线学习指南 学习通官网登录与使用方法
学习通网页版入口与在线学习指南 学习通官网登录与使用方法

本专题详细汇总了学习通网页版入口与登录方法,提供学习通官方网页端入口、学生登录平台、网页版使用指南等内容,帮助用户快速稳定地登录学习通官网,顺利进入学习平台,提升学习效率和体验。

9

2026.02.04

Python Web 框架 Django 深度开发
Python Web 框架 Django 深度开发

本专题系统讲解 Python Django 框架的核心功能与进阶开发技巧,包括 Django 项目结构、数据库模型与迁移、视图与模板渲染、表单与认证管理、RESTful API 开发、Django 中间件与缓存优化、部署与性能调优。通过实战案例,帮助学习者掌握 使用 Django 快速构建功能全面的 Web 应用与全栈开发能力。

9

2026.02.04

Java 流式处理与 Apache Kafka 实战
Java 流式处理与 Apache Kafka 实战

本专题专注讲解 Java 在流式数据处理与消息队列系统中的应用,系统讲解 Apache Kafka 的基础概念、生产者与消费者模型、Kafka Streams 与 KSQL 流式处理框架、实时数据分析与监控,结合实际业务场景,帮助开发者构建 高吞吐量、低延迟的实时数据流管道,实现高效的数据流转与处理。

3

2026.02.04

Golang 容器化与 Docker 实战
Golang 容器化与 Docker 实战

本专题深入讲解 Golang 应用的容器化与 Docker 部署,涵盖 Docker 基础概念、容器构建与镜像管理、Go 应用的 Dockerfile 编写、跨平台容器部署与优化、Docker Compose 和 Kubernetes 部署工具。通过实际案例,帮助学习者掌握 如何将 Golang 应用容器化并实现高效部署与管理,提升系统的可扩展性与运维效率。

3

2026.02.04

全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

59

2026.02.03

短剧入口地址汇总
短剧入口地址汇总

本专题整合了短剧app推荐平台,阅读专题下面的文章了解更多详细入口。

110

2026.02.03

植物大战僵尸版本入口地址汇总
植物大战僵尸版本入口地址汇总

本专题整合了植物大战僵尸版本入口地址汇总,前往文章中寻找想要的答案。

56

2026.02.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
深入剖析redis教程
深入剖析redis教程

共55课时 | 8.1万人学习

Redis中文开发手册
Redis中文开发手册

共0课时 | 0人学习

麦子学院深入浅出 redis 视频教程
麦子学院深入浅出 redis 视频教程

共20课时 | 4.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号