如果你也碰巧遇到后臺(tái)選擇的加密方式是DES的ECB模式侵贵,下面3種方式僅供參考碳柱;
/*使用CCCrypt(CCOperation op, CCAlgorithm alg, CCOptions options,
const void *key, size_t keyLength, const void *iv,
const void *dataIn, size_t dataInLength, void *dataOut,
size_t dataOutAvailable, size_t *dataOutMoved);
注意這里的options,如果使用的CBC模式加密直接寫kCCOptionPKCS7Padding;
*/
+(NSString *) encryptUseDES:(NSString *)clearText salt:(NSString *)key
{
NSData *data = [clearText dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
unsigned char buffer[1024];
memset(buffer, 0, sizeof(char));
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmDES,
kCCOptionPKCS7Padding | kCCOptionECBMode,
[key UTF8String],
kCCKeySizeDES,
nil,
[data bytes],
[data length],
buffer,
1024,
&numBytesEncrypted);
NSString* plainText = nil;
if (cryptStatus == kCCSuccess) {
NSData *dataTemp = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];
plainText = [DESUtil getHexStrFrom:dataTemp];
return plainText;
}else{
NSLog(@"DES加密失敗");
}
return plainText;
}
/*
CCCryptorStatus CCCryptorCreateWithMode(
CCOperation op, // kCCEncrypt, kCCDecrypt
CCMode mode,
CCAlgorithm alg,
CCPadding padding,
const void *iv, // optional initialization vector
const void *key, // raw key material
size_t keyLength,
const void *tweak, // raw tweak material
size_t tweakLength,
int numRounds, // 0 == default
CCModeOptions options,
CCCryptorRef *cryptorRef) // RETURNED
API_AVAILABLE(macos(10.7), ios(5.0));
CCCryptorGetOutputLength
CCCryptorUpdate
CCCryptorFinal
CCCryptorRelease
*/
+(NSString *) encryptUseDES:(NSString *)clearText key:(NSString *)key
{
NSString *ciphertext = nil;
NSData *textData = [clearText dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
NSUInteger dataLength = [textData length];
CCCryptorRef cryptor = nil;
NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
CCCryptorStatus cryptStatus = CCCryptorCreateWithMode(kCCEncrypt,
kCCModeECB,
kCCAlgorithmDES,
kCCOptionPKCS7Padding ,
NULL,
keyData.bytes,
keyData.length,
NULL,
0,
0,
0,
&cryptor);
size_t bufsize = CCCryptorGetOutputLength(cryptor, dataLength, YES);
size_t bufused = 0;
size_t bytesTotal = 0;
void * buf = malloc( bufsize );
cryptStatus = CCCryptorUpdate(cryptor, textData.bytes, textData.length, buf, bufsize, &bufused);
bytesTotal += bufused;
cryptStatus = CCCryptorFinal(cryptor, buf + bufused, bufsize - bufused, &bufused);
bytesTotal += bufused;
if (cryptStatus == kCCSuccess) {
NSLog(@"DES加密成功");
NSData *data = [NSData dataWithBytes:buf length:bytesTotal];
CCCryptorRelease(cryptor);
NSLog(@"data:%@",data);
ciphertext = [DESUtil getHexStrFrom:data];
}else{
NSLog(@"DES加密失敗");
}
return ciphertext;
}
/*
借助第三方庫(kù) IDZSwiftCommonCrypto
這里的options參數(shù)同方法一,看選擇什么模式
*/
func encrypt(text:String,salt:String) -> String? {
let key = Array(salt.utf8)
let bytes = Array(text.utf8)
let cryptor = Cryptor(operation: .encrypt, algorithm: .des, options: [.ECBMode,.PKCS7Padding], key: key, iv:[UInt8]())
if let encrypted = cryptor.update(byteArray: bytes)?.final() {
let data = Data(encrypted)
return DESUtil.getHexStr(from: data)
}
return nil
}
//最后附贈(zèng)一個(gè)data轉(zhuǎn)16進(jìn)制的方法;網(wǎng)上看到的幾個(gè)都多少有點(diǎn)問(wèn)題歼捏;
//Objective_C
+(NSString *) getHexStrFrom:(NSData*)data
{
NSMutableString *str = [NSMutableString string];
[data enumerateByteRangesUsingBlock:^(const void * _Nonnull bytes, NSRange byteRange, BOOL * _Nonnull stop) {
for (NSInteger i=0;i<byteRange.length;i++) {
NSString *hexStr = [NSString stringWithFormat:@"%x",((uint8_t *)bytes)[i] & 0xff];
if (hexStr.length == 2) {
[str appendString:hexStr];
} else {
[str appendString:[NSString stringWithFormat:@"0%@",hexStr]];
}
}
}];
return str;
}
//swift
func getHexStr(from data:Data) -> String {
var str = ""
data.enumerateBytes { (bytes, index, stop) in
let dataBytes = bytes
for index in 0..<dataBytes.count {
let hexStr = String.init(format: "%x", (dataBytes[index]) & 0xff)
if hexStr.count == 2 {
str.append(contentsOf: hexStr)
} else {
str.append(contentsOf: "0\(hexStr)")
}
}
}
return str
}