PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
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#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
|
/*** 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,__,__, __, 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
|
JAVA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
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);
}
}
|
原文:http://www.cnblogs.com/pengxl/p/3967040.html