java ios des加密解密_IOS、java支持DES加密

最近在考虑数据加密方面的需求,所以对数据加密简单的看了一下,当然不是看的原理,只是看看怎么能够实现。现在我们需要实现的是移动端和后台(java)数据加解密的配合,开始的时候考虑的使用RSA,因为RSA是非对称加密,更加安全点,但是RSA加密的过程中,ios公钥加密的数据,后台java是能够解密成功,但是后台java私钥加密的东西,前端ios,就没有解密成功,实验了很多方法,最终也没有成功,所以就放弃了,转向了安全性差一点的DES加密。

对于DES、RSA的介绍,自己百度去吧,因为我也说不明白。(上面我没有提Android,因为Android使用的是java,所以应该跟后台一致)

下面废话不多说,直接贴上代码:

IOS,需要引入GTMBase64.h、GTMBase64.m、GTMDefines.h,这个github上面有我,自己搜搜吧,还有。

[objc] view plaincopy

#import "ViewController.h"

#import

#import "GTMBase64.h"

@interface ViewController ()

@end

@implementation ViewController

-(void)viewDidLoad {

[super viewDidLoad];

NSString *key = @"这是个key";

NSString *encryptedData = [self encryptUseDES:@"this is a text" key:key];

NSLog(@"加密后的数据是:%@", encryptedData);

NSLog(@"解密后的数据是:%@", [self decryptUseDES:encryptedData key:key]);

}

-(void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

/*字符串加密

*参数

*plainText : 加密明文

*key : 密钥 64位

*/

-(NSString *) encryptUseDES:(NSString *)plainText key:(NSString *)key

{

NSString *ciphertext = nil;

const charchar *textBytes = [plainText UTF8String];

NSUInteger dataLength = [plainText length];

unsigned char buffer[1024];

memset(buffer, 0, sizeof(char));

Byte iv[] = {1,2,3,4,5,6,7,8};

size_t numBytesEncrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,

kCCOptionPKCS7Padding,

[key UTF8String], kCCKeySizeDES,

iv,

textBytes, dataLength,

buffer, 1024,

&numBytesEncrypted);

if (cryptStatus == kCCSuccess) {

NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];

ciphertext = [[NSString alloc] initWithData:[GTMBase64 encodeData:data] encoding:NSUTF8StringEncoding];

}

return ciphertext;

}

//解密

-(NSString *) decryptUseDES:(NSString*)cipherText key:(NSString*)key

{

NSData* cipherData = [GTMBase64 decodeString:cipherText];

unsigned char buffer[1024];

memset(buffer, 0, sizeof(char));

size_t numBytesDecrypted = 0;

Byte iv[] = {1,2,3,4,5,6,7,8};

CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,

kCCAlgorithmDES,

kCCOptionPKCS7Padding,

[key UTF8String],

kCCKeySizeDES,

iv,

[cipherData bytes],

[cipherData length],

buffer,

1024,

&numBytesDecrypted);

NSString* plainText = nil;

if (cryptStatus == kCCSuccess) {

NSData* data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesDecrypted];

plainText = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

}

return plainText;

}

@end

java 代码:需要自己引入sun.misc.BASE64Decoder.jar

[java] view plaincopy

package com.yue;

import java.io.IOException;

import java.security.SecureRandom;

import javax.crypto.Cipher;

import javax.crypto.SecretKey;

import javax.crypto.SecretKeyFactory;

import javax.crypto.spec.DESKeySpec;

import Decoder.BASE64Decoder;

import Decoder.BASE64Encoder;

public class DesUtil {

private final static String DES = "DES";

public static void main(String[] args) throws Exception {

String data = "123 456";

String key = "abcdefgh";

System.err.println(encrypt(data, key));

System.err.println(decrypt(encrypt(data, key), key));

System.out.println(decrypt("JF5dX/TlOg529KAhh+vywjzIp5Msktmf", key));

}

/**

* Description 根据键值进行加密

* @param data

* @param key 加密键byte数组

* @return

* @throws Exception

*/

public static String encrypt(String data, String key) throws Exception {

byte[] bt = encrypt(data.getBytes(), key.getBytes());

String strs = new BASE64Encoder().encode(bt);

return strs;

}

/**

* Description 根据键值进行解密

* @param data

* @param key 加密键byte数组

* @return

* @throws IOException

* @throws Exception

*/

public static String decrypt(String data, String key) throws IOException,

Exception {

if (data == null)

return null;

BASE64Decoder decoder = new BASE64Decoder();

byte[] buf = decoder.decodeBuffer(data);

byte[] bt = decrypt(buf,key.getBytes());

return new String(bt);

}

/**

* Description 根据键值进行加密

* @param data

* @param key 加密键byte数组

* @return

* @throws Exception

*/

private static byte[] encrypt(byte[] data, byte[] key) throws Exception {

// 生成一个可信任的随机数源

SecureRandom sr = new SecureRandom();

// 从原始密钥数据创建DESKeySpec对象

DESKeySpec dks = new DESKeySpec(key);

// 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);

SecretKey securekey = keyFactory.generateSecret(dks);

// Cipher对象实际完成加密操作

Cipher cipher = Cipher.getInstance(DES);

// 用密钥初始化Cipher对象

cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);

return cipher.doFinal(data);

}

/**

* Description 根据键值进行解密

* @param data

* @param key 加密键byte数组

* @return

* @throws Exception

*/

private static byte[] decrypt(byte[] data, byte[] key) throws Exception {

// 生成一个可信任的随机数源

SecureRandom sr = new SecureRandom();

// 从原始密钥数据创建DESKeySpec对象

DESKeySpec dks = new DESKeySpec(key);

// 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);

SecretKey securekey = keyFactory.generateSecret(dks);

// Cipher对象实际完成解密操作

Cipher cipher = Cipher.getInstance(DES);

// 用密钥初始化Cipher对象

cipher.init(Cipher.DECRYPT_MODE, securekey, sr);

return cipher.doFinal(data);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值