转载请注明博客地址:http://blog.csdn.net/mengxiangyue/article/details/40015727

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

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

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

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

#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 char *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;

}

@endjava 代码:须要自己引入sun.misc.BASE64Decoder.jar

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);

}

}

代码下载地址:http://download.csdn.net/detail/mengxiangyue/8028311

java ios des加密解密_IOS、java支持DES加密相关推荐

  1. AES加密解密算法Java实现

    AES加密算法是密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DE ...

  2. AES加密解密(java、web、app)

    AES加密解密(java.web.app) AES加密解密(java.web.app) java端 Web端 ios端 AES加密解密(java.web.app) java端 package com. ...

  3. 加密解密系列文章之 - ASCII 加密解密(最简单的加密解密) 上

    前言: 首先.在这里声明.本人没学过加密解密专业以及没有对加密解密做过任何的系统学习.文章用来记录我自己学到的加密解密的一些我理解的东西,有错误之处欢迎大家指出.谢谢. 加密解密.在以前我的眼里.是灰 ...

  4. 加密解密系列文章之 - ASCII 加密解密(最简单的加密解密) 下

    继上一篇 加密解密系列文章之 - ASCII 加密解密(最简单的加密解密) 上 的下篇. 我在 上 篇里 已经给大家说了最基本的ASCII 加密 解密的东西.然后再最后 我们说了ASCII加密解密的问 ...

  5. 企业级程序 苏林加密系统内测发布 支持多种加密

    简介: 苏林加密系统是一款专门为php加密的程序,支持sg11加密.xend加密.goto加密.Leave加密.enphp加密.NoName加密,可以发展用户,可以设置某加密价格,支持api接口加密, ...

  6. sm2多端加密解密,java,js,android,ios实战

    SM2非对称加密 公钥 = 04xxxxxxxxxxxxxxxxxxxx,私钥 = 276xxxx原文:你哦哈1232154 3654 {} ,俺可接受不符点 公钥私钥是我后台自己生成的, java代 ...

  7. DES加密解密算法Java实现

    DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小.这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半.使用子密钥对其中一半应 ...

  8. java des加密解密_Java实现的DES加密解密工具类实例

    本文实例讲述了Java实现的DES加密解密工具类.分享给大家供大家参考,具体如下: 一个工具类,很常用,不做深入研究了,那来可直接用 DesUtil.java package lsy; import ...

  9. delphi7aes加密解密与java互转_跨语言(java vs python vs nodejs)的RSA加解密问题探讨

    多次被问到这样的问题: java服务端的rsa加密操作已经完成,返回一个16进制的字符串给python平台,但是在python进行私钥解密的时候发现行不通.... 前端python加密,后端用java ...

最新文章

  1. Linux中命令配置防火墙
  2. .net core 1.0 实现负载多服务器单点登录
  3. 案例详解Python变量的作用域是怎么使用的,面试必学
  4. 机器人学习--Turtelbot3学习--如何使用cartographer建图
  5. 栈(顺序存储)C++模板实现
  6. .NET Framework 4.8发布
  7. matlab找距离最近的元素,如何用MATLAB找到给定坐标的最近点?
  8. JavaScript常用数组操作方法,包含ES6方法
  9. 关于AfxMessageBox没有重载函数
  10. 计算机网络的通信方式有哪几种,数据通信方式有哪几种
  11. 【NFC】 NfcA/NfcB/NfcF/NfcV/IsoDep/Ndef/Mifare/Felica/Pboc/ISOxxxx 都是些什么鸟玩意?
  12. SpringBoot错误处理原理及定制错误页面及错误数据
  13. Flutter使用阿里矢量图库管理项目svg图片
  14. 二叉搜索树前序序列转后序序列(或相反)
  15. 计算机密码怎么重置,电脑忘记密码了怎么重置密码
  16. NYOJ-845-无主之地1-2013年11月3日00:08:18
  17. 菜谱分享APP/基于android菜谱分享系统
  18. 通过按键控制二极管c语言,单片机一个按键控制一个发光二极管
  19. 基于听觉特性的Mel频率倒谱分析
  20. 浪潮信息的ai服务器有何不同,浪潮信息新品AI服务器 可支持最新NVIDIA A100 PCIe Gen4...

热门文章

  1. java微信小程序音乐播放器分享系统
  2. Postgres安装及MIMIC IV数据库的载入(Windows 10)
  3. Android游戏源码合集(主要是AndEngine和Libgdx的)
  4. Android 学习之垂直切换的圆角 Banner 和垂直指示器
  5. 视频监控存储所需容量大小计算
  6. 模拟喷泉码(入门二):Seamless Rate Adaptation for Wireless Networking
  7. C++ 一文解决 数据库ODB 安装/调试/使用的问题
  8. 【Django入门】——模型管理器对象、模型管理器类和模型类
  9. 弹出框和提示框效果以及代码展示
  10. 编译内核报错 bison not found