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上面有我,自己搜搜吧,还有<CommonCrypto/CommonCryptor.h>。

[objc] view plaincopy

  1. #import "ViewController.h"
  2. #import <CommonCrypto/CommonCryptor.h>
  3. #import "GTMBase64.h"
  4. @interface ViewController ()
  5. @end
  6. @implementation ViewController
  7. - (void)viewDidLoad {
  8. [super viewDidLoad];
  9. NSString *key = @"这是个key";
  10. NSString *encryptedData = [self encryptUseDES:@"this is a text" key:key];
  11. NSLog(@"加密后的数据是:%@", encryptedData);
  12. NSLog(@"解密后的数据是:%@", [self decryptUseDES:encryptedData key:key]);
  13. }
  14. - (void)didReceiveMemoryWarning {
  15. [super didReceiveMemoryWarning];
  16. // Dispose of any resources that can be recreated.
  17. }
  18. /*字符串加密
  19. *参数
  20. *plainText : 加密明文
  21. *key        : 密钥 64位
  22. */
  23. - (NSString *) encryptUseDES:(NSString *)plainText key:(NSString *)key
  24. {
  25. NSString *ciphertext = nil;
  26. const charchar *textBytes = [plainText UTF8String];
  27. NSUInteger dataLength = [plainText length];
  28. unsigned char buffer[1024];
  29. memset(buffer, 0, sizeof(char));
  30. Byte iv[] = {1,2,3,4,5,6,7,8};
  31. size_t numBytesEncrypted = 0;
  32. CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,
  33. kCCOptionPKCS7Padding,
  34. [key UTF8String], kCCKeySizeDES,
  35. iv,
  36. textBytes, dataLength,
  37. buffer, 1024,
  38. &numBytesEncrypted);
  39. if (cryptStatus == kCCSuccess) {
  40. NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];
  41. ciphertext = [[NSString alloc] initWithData:[GTMBase64 encodeData:data] encoding:NSUTF8StringEncoding];
  42. }
  43. return ciphertext;
  44. }
  45. //解密
  46. - (NSString *) decryptUseDES:(NSString*)cipherText key:(NSString*)key
  47. {
  48. NSData* cipherData = [GTMBase64 decodeString:cipherText];
  49. unsigned char buffer[1024];
  50. memset(buffer, 0, sizeof(char));
  51. size_t numBytesDecrypted = 0;
  52. Byte iv[] = {1,2,3,4,5,6,7,8};
  53. CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
  54. kCCAlgorithmDES,
  55. kCCOptionPKCS7Padding,
  56. [key UTF8String],
  57. kCCKeySizeDES,
  58. iv,
  59. [cipherData bytes],
  60. [cipherData length],
  61. buffer,
  62. 1024,
  63. &numBytesDecrypted);
  64. NSString* plainText = nil;
  65. if (cryptStatus == kCCSuccess) {
  66. NSData* data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesDecrypted];
  67. plainText = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  68. }
  69. return plainText;
  70. }
  71. @end

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

[java] view plaincopy

  1. package com.yue;
  2. import java.io.IOException;
  3. import java.security.SecureRandom;
  4. import javax.crypto.Cipher;
  5. import javax.crypto.SecretKey;
  6. import javax.crypto.SecretKeyFactory;
  7. import javax.crypto.spec.DESKeySpec;
  8. import Decoder.BASE64Decoder;
  9. import Decoder.BASE64Encoder;
  10. public class DesUtil {
  11. private final static String DES = "DES";
  12. public static void main(String[] args) throws Exception {
  13. String data = "123 456";
  14. String key = "abcdefgh";
  15. System.err.println(encrypt(data, key));
  16. System.err.println(decrypt(encrypt(data, key), key));
  17. System.out.println(decrypt("JF5dX/TlOg529KAhh+vywjzIp5Msktmf", key));
  18. }
  19. /**
  20. * Description 根据键值进行加密
  21. * @param data
  22. * @param key  加密键byte数组
  23. * @return
  24. * @throws Exception
  25. */
  26. public static String encrypt(String data, String key) throws Exception {
  27. byte[] bt = encrypt(data.getBytes(), key.getBytes());
  28. String strs = new BASE64Encoder().encode(bt);
  29. return strs;
  30. }
  31. /**
  32. * Description 根据键值进行解密
  33. * @param data
  34. * @param key  加密键byte数组
  35. * @return
  36. * @throws IOException
  37. * @throws Exception
  38. */
  39. public static String decrypt(String data, String key) throws IOException,
  40. Exception {
  41. if (data == null)
  42. return null;
  43. BASE64Decoder decoder = new BASE64Decoder();
  44. byte[] buf = decoder.decodeBuffer(data);
  45. byte[] bt = decrypt(buf,key.getBytes());
  46. return new String(bt);
  47. }
  48. /**
  49. * Description 根据键值进行加密
  50. * @param data
  51. * @param key  加密键byte数组
  52. * @return
  53. * @throws Exception
  54. */
  55. private static byte[] encrypt(byte[] data, byte[] key) throws Exception {
  56. // 生成一个可信任的随机数源
  57. SecureRandom sr = new SecureRandom();
  58. // 从原始密钥数据创建DESKeySpec对象
  59. DESKeySpec dks = new DESKeySpec(key);
  60. // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
  61. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
  62. SecretKey securekey = keyFactory.generateSecret(dks);
  63. // Cipher对象实际完成加密操作
  64. Cipher cipher = Cipher.getInstance(DES);
  65. // 用密钥初始化Cipher对象
  66. cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);
  67. return cipher.doFinal(data);
  68. }
  69. /**
  70. * Description 根据键值进行解密
  71. * @param data
  72. * @param key  加密键byte数组
  73. * @return
  74. * @throws Exception
  75. */
  76. private static byte[] decrypt(byte[] data, byte[] key) throws Exception {
  77. // 生成一个可信任的随机数源
  78. SecureRandom sr = new SecureRandom();
  79. // 从原始密钥数据创建DESKeySpec对象
  80. DESKeySpec dks = new DESKeySpec(key);
  81. // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
  82. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
  83. SecretKey securekey = keyFactory.generateSecret(dks);
  84. // Cipher对象实际完成解密操作
  85. Cipher cipher = Cipher.getInstance(DES);
  86. // 用密钥初始化Cipher对象
  87. cipher.init(Cipher.DECRYPT_MODE, securekey, sr);
  88. return cipher.doFinal(data);
  89. }
时间: 2024-10-13 06:10:16

IOS、java支持DES加密的相关文章

关于Objective-c和Java下DES加密保持一致的方式

转载自:http://www.cnblogs.com/janken/archive/2012/04/05/2432930.html 最近做了一个移动项目,是有服务器和客户端类型的项目,客户端是要登录才行的,登录的密码要用DES加密,服务器是用Java开发的,客户端要同时支持多平台(Android.iOS),在处理iOS的DES加密的时候遇到了一些问题,起初怎么调都调不成和Android端生成的密文相同.最终一个忽然的想法让我找到了问题的所在,现在将代码总结一下,以备自己以后查阅. 首先,Java

兼容PHP和Java的des加密解密代码分享

这篇文章主要介绍了兼容PHP和Java的des加密解密代码分享,适合如服务器是JAVA语言编写,客户端是PHP编写,并需要des加密解密的情况,需要的朋友可以参考下 php <?php class DES { var $key; var $iv; //偏移量 function DES($key, $iv=0) { $this->key = $key; if($iv == 0) { $this->iv = $key; } else { $this->iv = $iv; } } //加

JAVA实现DES加密

JAVA实现DES加密 DES加密介绍 DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法.DES加密算法出自IBM的研究,后来被美国政府正式采用,之后开始广泛流传,但是近些年使用越来越少,因为DES使用56位密钥,以现代计算能力,24小时内即可被破解.虽然如此,在某些简单应用中,我们还是可以使用DES加密算法,本文简单讲解DES的JAVA实现. JAVA实现 加密 代码有详细解释,不多废话. 注意:DES加密和解密过程中,密钥长度都必须是8的倍数 [java] view

JAVA使用DES加密解密

在使用DES加密解密的时候,遇到了一些问题,廖记一下.如有哪位大神亲临留言指点,不胜感激. 先上代码: public DESUtil() { } //密码,长度要是8的倍数 注意此处为简单密码 简单应用 要求不高时可用此密码 /*DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法.DES加密算法出自IBM的研究,后来被美国政府正式采用,之后开始广泛流传,但是近些年使用越来越少,因为DES使用56位密钥,以现代计算能力,24小时内即可被破解.*/ private stati

java 实现 DES加密 解密算法

DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥:Data也为8个字节64位,是要被加密或被解密的数据:Mode为DES的工作方式,有两种:加密或解密.  DES算法是这样工作的:如Mode为加密,则用Key 去把数据Data进行加密, 生成Data的密码形式(64位)作为DES的输出结果:如 Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果.在通信网络的两端,双方约定一致

java实现DES加密与解密,md5加密

很多时候要对秘要进行持久化加密,此时的加密采用md5.采用对称加密的时候就采用DES方法了 1 import java.io.IOException; 2 import java.security.MessageDigest; 3 import java.security.SecureRandom; 4 5 import javax.crypto.Cipher; 6 import javax.crypto.SecretKey; 7 import javax.crypto.SecretKeyFac

JAVA实现DES加密实现详解

package util; import java.security.SecureRandom;import javax.crypto.spec.DESKeySpec;import javax.crypto.SecretKeyFactory;import javax.crypto.SecretKey;import javax.crypto.Cipher; /** DES加密介绍DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法.DES加密算法出自IBM的研究, 后来被美国

(iOS)Base64加密和DES加密、以及JAVA和iOS中DES加密统一性问题

我们在项目中为了安全方面的考虑,通常情况下会选择一种加密方式对需要安全性的文本进行加密,而Base64加密和DES64加密是常用的加密算法.我记得我在前一个项目中使用的就是这两种加密算法的结合:Base64 + DES加密.当然这需要移动端和后台服务器做一个统一. 1.Base64加解密 值得一提的是:apple提供了基础的Base64加解密算法.这样我们就可以直接使用方法去实现Base64加解密.先看一下apple都提供了哪些方法: @interface NSData (NSDataBase6

使用C# DES解密java DES加密的字符串

转自 microAllen 最近需要使用C#的DES解密工具类解密字符串,但是要解密的字符串是使用java进行DES加密的,去网上查了关于C#和java关于DES加密解密的资料,发现可以相互加密解密的时候,java进行DES加密一般都会写成如下:public static byte[] encrypt(String message, String key) throws Exception {     Cipher cipher = Cipher.getInstance("DES/CBC/PKC