java ios des加密解密_IOS、java支持DES加密
转载请注明博客地址: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加密相关推荐
- AES加密解密算法Java实现
AES加密算法是密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DE ...
- AES加密解密(java、web、app)
AES加密解密(java.web.app) AES加密解密(java.web.app) java端 Web端 ios端 AES加密解密(java.web.app) java端 package com. ...
- 加密解密系列文章之 - ASCII 加密解密(最简单的加密解密) 上
前言: 首先.在这里声明.本人没学过加密解密专业以及没有对加密解密做过任何的系统学习.文章用来记录我自己学到的加密解密的一些我理解的东西,有错误之处欢迎大家指出.谢谢. 加密解密.在以前我的眼里.是灰 ...
- 加密解密系列文章之 - ASCII 加密解密(最简单的加密解密) 下
继上一篇 加密解密系列文章之 - ASCII 加密解密(最简单的加密解密) 上 的下篇. 我在 上 篇里 已经给大家说了最基本的ASCII 加密 解密的东西.然后再最后 我们说了ASCII加密解密的问 ...
- 企业级程序 苏林加密系统内测发布 支持多种加密
简介: 苏林加密系统是一款专门为php加密的程序,支持sg11加密.xend加密.goto加密.Leave加密.enphp加密.NoName加密,可以发展用户,可以设置某加密价格,支持api接口加密, ...
- sm2多端加密解密,java,js,android,ios实战
SM2非对称加密 公钥 = 04xxxxxxxxxxxxxxxxxxxx,私钥 = 276xxxx原文:你哦哈1232154 3654 {} ,俺可接受不符点 公钥私钥是我后台自己生成的, java代 ...
- DES加密解密算法Java实现
DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小.这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半.使用子密钥对其中一半应 ...
- java des加密解密_Java实现的DES加密解密工具类实例
本文实例讲述了Java实现的DES加密解密工具类.分享给大家供大家参考,具体如下: 一个工具类,很常用,不做深入研究了,那来可直接用 DesUtil.java package lsy; import ...
- delphi7aes加密解密与java互转_跨语言(java vs python vs nodejs)的RSA加解密问题探讨
多次被问到这样的问题: java服务端的rsa加密操作已经完成,返回一个16进制的字符串给python平台,但是在python进行私钥解密的时候发现行不通.... 前端python加密,后端用java ...
最新文章
- Linux中命令配置防火墙
- .net core 1.0 实现负载多服务器单点登录
- 案例详解Python变量的作用域是怎么使用的,面试必学
- 机器人学习--Turtelbot3学习--如何使用cartographer建图
- 栈(顺序存储)C++模板实现
- .NET Framework 4.8发布
- matlab找距离最近的元素,如何用MATLAB找到给定坐标的最近点?
- JavaScript常用数组操作方法,包含ES6方法
- 关于AfxMessageBox没有重载函数
- 计算机网络的通信方式有哪几种,数据通信方式有哪几种
- 【NFC】 NfcA/NfcB/NfcF/NfcV/IsoDep/Ndef/Mifare/Felica/Pboc/ISOxxxx 都是些什么鸟玩意?
- SpringBoot错误处理原理及定制错误页面及错误数据
- Flutter使用阿里矢量图库管理项目svg图片
- 二叉搜索树前序序列转后序序列(或相反)
- 计算机密码怎么重置,电脑忘记密码了怎么重置密码
- NYOJ-845-无主之地1-2013年11月3日00:08:18
- 菜谱分享APP/基于android菜谱分享系统
- 通过按键控制二极管c语言,单片机一个按键控制一个发光二极管
- 基于听觉特性的Mel频率倒谱分析
- 浪潮信息的ai服务器有何不同,浪潮信息新品AI服务器 可支持最新NVIDIA A100 PCIe Gen4...
热门文章
- java微信小程序音乐播放器分享系统
- Postgres安装及MIMIC IV数据库的载入(Windows 10)
- Android游戏源码合集(主要是AndEngine和Libgdx的)
- Android 学习之垂直切换的圆角 Banner 和垂直指示器
- 视频监控存储所需容量大小计算
- 模拟喷泉码(入门二):Seamless Rate Adaptation for Wireless Networking
- C++ 一文解决 数据库ODB 安装/调试/使用的问题
- 【Django入门】——模型管理器对象、模型管理器类和模型类
- 弹出框和提示框效果以及代码展示
- 编译内核报错 bison not found