ios--加密、解密

一、des加、解密:

1.原理:DES加密 :用CCCrypt函数加密一下,然后用base64编码下,传过去

    DES解密 :把收到的数据根据base64,decode一下,然后再用CCCrypt函数解密,得到原本的数据

2.需要包含:

#import <CommonCrypto/CommonCryptor.h> (CCCrypt所在的文件)

#import "GTMBase64.h"(base64算法)

3.具体实现:

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

//加密

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

{

NSString *ciphertext = nil;

NSData *textData = [plainText dataUsingEncoding:NSUTF8StringEncoding];

NSUInteger dataLength = [textData length];

unsigned char buffer[1024];

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

size_t numBytesEncrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,

kCCOptionPKCS7Padding,

[key UTF8String], kCCKeySizeDES,

iv,

[textData bytes], 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;

}

附:Java端的DES加解密的实现方式,代码如下:

  

public class DES {

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

public static String encryptDES(String encryptString, String encryptKey)
throws Exception {
IvParameterSpec zeroIv = new IvParameterSpec(iv);
SecretKeySpec key = new SecretKeySpec(encryptKey.getBytes(), "DES");
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
byte[] encryptedData = cipher.doFinal(encryptString.getBytes());
return Base64.encode(encryptedData);
}
}

上述代码用到了一个Base64的编码类,其代码的实现方式如下:

public class Base64 {
private static final char[] legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
.toCharArray();

/**
* data[]进行编码
*
* @param data
* @return
*/
public static String encode(byte[] data) {
int start = 0;
int len = data.length;
StringBuffer buf = new StringBuffer(data.length * 3 / 2);

int end = len - 3;
int i = start;
int n = 0;

while (i <= end) {
int d = ((((int) data[i]) & 0x0ff) << 16)
| ((((int) data[i + 1]) & 0x0ff) << 8)
| (((int) data[i + 2]) & 0x0ff);

buf.append(legalChars[(d >> 18) & 63]);
buf.append(legalChars[(d >> 12) & 63]);
buf.append(legalChars[(d >> 6) & 63]);
buf.append(legalChars[d & 63]);

i += 3;

if (n++ >= 14) {
n = 0;
buf.append(" ");
}
}

if (i == start + len - 2) {
int d = ((((int) data[i]) & 0x0ff) << 16)
| ((((int) data[i + 1]) & 255) << 8);

buf.append(legalChars[(d >> 18) & 63]);
buf.append(legalChars[(d >> 12) & 63]);
buf.append(legalChars[(d >> 6) & 63]);
buf.append("=");
} else if (i == start + len - 1) {
int d = (((int) data[i]) & 0x0ff) << 16;

buf.append(legalChars[(d >> 18) & 63]);
buf.append(legalChars[(d >> 12) & 63]);
buf.append("==");
}

return buf.toString();
}

二、MD5加密

不可逆

128位或者64位串,byte数字长度就是16和8,一般表示是使用16进制来表示的话,1个byte转换成2个16bit,分别表示高地位,所以生成的字符串是16位或者是32位的,16位其实是从32位中的中间部分抽出来的。

我们所说的密码多少位,是表示多少bit,转换成byte数组的话,就是除以8,但是如果输出16进制的话就是除以4,因为"1111 1111"="FF";

举例来说:256位 byte数组或者NSData的length就是256/8=32 输出16进制就是32*2=64位

JAVA代码:

//byte字节转换成16进制的字符串MD5Utils.hexString
public static String hexString(byte[] bytes){
StringBuffer hexValue = new StringBuffer();

for (int i = 0; i < bytes.length; i++) {
int val = ((int) bytes[i]) & 0xff;
if (val < 16)
hexValue.append("0");
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString();
}

public byte[] eccrypt(String info) throws NoSuchAlgorithmException{
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] srcBytes = info.getBytes();
//使用srcBytes更新摘要
md5.update(srcBytes);
//完成哈希计算,得到result
byte[] resultBytes = md5.digest();
return resultBytes;
}

public static void main(String args[]) throws NoSuchAlgorithmException{
String msg = "欢迎光临JerryVon的博客";
EncrypMD5 md5 = new EncrypMD5();
byte[] resultBytes = md5.eccrypt(msg);
System.out.println("密文是:" + MD5Utils.hexString(resultBytes));
System.out.println("明文是:" + msg);
}

 

Objective-C代码:(此处一般用32位)

//16位MD5加密方式
- (NSString *)getMd5_16Bit_String:(NSString *)srcString{
//提取32位MD5散列的中间16位
NSString *md5_32Bit_String=[self getMd5_32Bit_String:srcString];
NSString *result = [[md5_32Bit_String substringToIndex:24] substringFromIndex:8];//即9~25位

return result;
}

//32位MD5加密方式
- (NSString *)getMd5_32Bit_String:(NSString *)srcString{
const char *cStr = [srcString UTF8String];
unsigned char digest[CC_MD5_DIGEST_LENGTH];
CC_MD5( cStr, strlen(cStr), digest );
NSMutableString *result = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
[result appendFormat:@"%02x", digest[i]];

return result;
}

最后结果是:

明文:欢迎光临JerryVon的博客

密文(32位):3635dc132ba0e49f17534e749b8a99d1
密文(16位):2ba0e49f17534e74

只要比较最后的HEX值,就可以查看原来的串是否相等。

还可以对MD5进行二次加密,也就是对原串进行2次MD5加密

时间: 2024-11-09 15:28:27

ios--加密、解密的相关文章

iOS base64加密解密

本文转载至 http://jingyan.baidu.com/article/93f9803fff45c9e0e46f5596.html 从参考资料的地址中下载GTMBase64.zip库文件包,并解压,获得GTMBase64.h,GTMBase64.m和GTMDefines.h三个文件. 将解压得到的三个文件,添加到项目中. 新建一个base64的类,在base64.h中天假四个函数: + (NSString*)encodeBase64String:(NSString*)input; + (N

关于 Des加密(Android与ios 与后台java服务器之间的加密解密)

关于 Des加密(Android与ios  与后台java服务器之间的加密解密) http://blog.sina.com.cn/s/blog_7c8dc2d50101id91.html (2013-04-17 11:47:23)   分类: iPhone开发 最近做了一个移动项目,是有服务器和客户端类型的项目,客户端是要登录才行的,登录的密码要用DES加密,服务器是用Java开发的,客户端要同时支持多平台(Android.iOS),在处理iOS的DES加密的时候遇到了一些问题,起初怎么调都调不

.NET/andriod/java/iOS AES通用加密解密

移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如.NET和android或者iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输.今天研究了一下,把几种语言的加密都实践了一遍,实现了.NET,java(andriod),iOS都同一套的加密算法,下面就分享给大家. AES加密有多种算法模式,下面提供两套模式的可用源码. 加密方式: 先将文本AES加密 返回Base64转码 解密方式: 将数据进行Base64解码 进行AES解密 一.CBC(Cipher Blo

【转】 iOS DES ECB模式对称加密解密

最近忙于android和iOS的项目,写完了android的DES 的ECB模式加密解密(相关连接:http://blog.csdn.net/vipa1888/article/details/8086037),又 回到了Ios上面,因为本人也是最近今年开始研究ios的,所以Ios上面好多东西都不懂,进过了半年的研究,终于吧ios的DES 的ECB模式对称加密解密搞定了,本人遇到的问题很严重的问题,网上写的好多16进制数转化位字节都有问题的,经过本人研究发现他们有一个地方写错了,导 致解密后的NS

iOS 3DES加密解密(一行代码搞定)

3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解:3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法. 3DES又称Triple DES,是DES加密算法的一种模式,它使用3条56位的密钥对数据进行三次加密.数据加密标

DES非对称加密解密跨平台(C#,安卓,ios)

#region 跨平台加解密(c# 安卓 IOS) public static string sKey = "123456"; /// <summary> /// 解密 /// </summary> /// <param name="pToDecrypt">要解密的以Base64</param> /// <param name="sKey">密钥,且必须为8位</param>

简进祥==iOS 3DES加密解密

3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解:3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法. 3DES又称Triple DES,是DES加密算法的一种模式,它使用3条56位的密钥对数据进行三次加密.数据加密标

iOS中使用RSA对数据进行加密解密

RSA算法是一种非对称加密算法,常被用于加密数据传输.如果配合上数字摘要算法, 也可以用于文件签名. 本文将讨论如何在iOS中使用RSA传输加密数据. 本文环境 mac os openssl-1.0.1j, openssl需要使用1.x版本, 推荐使用[homebrew](http://brew.sh/)安装. Java 8 RSA基本原理 RSA使用"秘匙对"对数据进行加密解密.在加密解密数据前,需要先生成公钥(public key)和私钥(private key). 公钥(publ

iOS常用加密之RSA加密解密

前言: iOS常用的加密有很多种,前两天在工作中遇到了RSA加密,现在把代吗分享出来. RSA基本原理 RSA使用"秘匙对"对数据进行加密解密.在加密解密数据前,需要先生成公钥(public key)和私钥(private key). 公钥(public key): 用于加密数据. 用于公开, 一般存放在数据提供方, 例如iOS客户端. 私钥(private key): 用于解密数据. 必须保密, 私钥泄露会造成安全问题 第一步:公钥.私钥的生成 iOS开发者可直接在Mac终端生成,命

ios常见加密解密方法

在其他平台中经常会计算MD5值,在iOS平台中也提供了该方法,首先需要导入头文件 [cpp] view plain copy #import <CommonCrypto/CommonDigest.h> 方法CC_MD5可以获取MD5的16个字符的数组,再通过%02X的形式输出即可获取32位MD5值. [cpp] view plain copy @implementation NSString (CCCryptUtil) -(NSString*) md5 { const char * cStrV