iOS&Java常用加密(一)

一.HASH散列算法

1.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代码:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. //byte字节转换成16进制的字符串MD5Utils.hexString  
  2.     public static String hexString(byte[] bytes){  
  3.         StringBuffer hexValue = new StringBuffer();  
  4.   
  5.         for (int i = 0; i < bytes.length; i++) {  
  6.             int val = ((int) bytes[i]) & 0xff;  
  7.             if (val < 16)  
  8.                 hexValue.append("0");  
  9.             hexValue.append(Integer.toHexString(val));  
  10.         }  
  11.         return hexValue.toString();  
  12.     }  

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1.   public byte[] eccrypt(String info) throws NoSuchAlgorithmException{  
  2.       MessageDigest md5 = MessageDigest.getInstance("MD5");  
  3.       byte[] srcBytes = info.getBytes();  
  4.       //使用srcBytes更新摘要  
  5.       md5.update(srcBytes);  
  6.       //完成哈希计算,得到result  
  7.       byte[] resultBytes = md5.digest();  
  8.       return resultBytes;  
  9.   }  
  10.   
  11. ublic static void main(String args[]) throws NoSuchAlgorithmException{  
  12. String msg = "欢迎光临JerryVon的博客";  
  13. EncrypMD5 md5 = new EncrypMD5();  
  14. byte[] resultBytes = md5.eccrypt(msg);  
  15. System.out.println("密文是:" + MD5Utils.hexString(resultBytes));  
  16. System.out.println("明文是:" + msg);  


Objective-C代码:

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. //16位MD5加密方式  
  2. - (NSString *)getMd5_16Bit_String:(NSString *)srcString{  
  3.     //提取32位MD5散列的中间16位  
  4.     NSString *md5_32Bit_String=[self getMd5_32Bit_String:srcString];  
  5.     NSString *result = [[md5_32Bit_String substringToIndex:24] substringFromIndex:8];//即9~25位  
  6.    
  7.     return result;  
  8. }  
  9.   
  10.   
  11. //32位MD5加密方式  
  12. - (NSString *)getMd5_32Bit_String:(NSString *)srcString{  
  13.     const char *cStr = [srcString UTF8String];  
  14.     unsigned char digest[CC_MD5_DIGEST_LENGTH];  
  15.     CC_MD5( cStr, strlen(cStr), digest );  
  16.     NSMutableString *result = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];  
  17.     for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)  
  18.         [result appendFormat:@"%02x", digest[i]];  
  19.       
  20.     return result;  
  21. }  
最后结果是:

明文:欢迎光临JerryVon的博客

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

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

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


2.SHA算法

不可逆

SHA1,SHA256,SHA384,SHA512 分别对应160位,256位,384位,512位

JAVA代码

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public byte[] eccrypt(String info,String shaType) throws NoSuchAlgorithmException{  
  2.         MessageDigest sha = MessageDigest.getInstance(shaType);  
  3.         byte[] srcBytes = info.getBytes();  
  4.         //使用srcBytes更新摘要  
  5.         sha.update(srcBytes);  
  6.         //完成哈希计算,得到result  
  7.         byte[] resultBytes = sha.digest();  
  8.         return resultBytes;  
  9.     }  
  10.     public byte[] eccryptSHA1(String info) throws NoSuchAlgorithmException{  
  11.        return eccrypt(info,"SHA1");  
  12.     }  
  13.     public byte[] eccryptSHA256(String info) throws NoSuchAlgorithmException{  
  14.         return eccrypt(info,"SHA-256");  
  15.     }  
  16.     public byte[] eccryptSHA384(String info) throws NoSuchAlgorithmException{  
  17.         return eccrypt(info,"SHA-384");  
  18.     }  
  19.     public byte[] eccryptSHA512(String info) throws NoSuchAlgorithmException{  
  20.         return eccrypt(info,"SHA-512");  
  21.     }  
  22.     public static void main(String[] args) throws NoSuchAlgorithmException {  
  23.         String msg ="欢迎光临JerryVon的博客";  
  24.         EncrypSHA sha = new EncrypSHA();  
  25.         System.out.println("明文是:" + msg);  
  26.         System.out.println("密文是:" + MD5Utils.hexString(sha.eccryptSHA1(msg)));  
  27.         System.out.println("密文是:" + MD5Utils.hexString(sha.eccryptSHA256(msg)));  
  28.         System.out.println("密文是:" + MD5Utils.hexString(sha.eccryptSHA384(msg)));  
  29.         System.out.println("密文是:" + MD5Utils.hexString(sha.eccryptSHA512(msg)));  
  30.     }  

Objective-C代码
[objc]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. //sha1加密方式  
  2. - (NSString *)getSha1String:(NSString *)srcString{  
  3.     const charchar *cstr = [srcString UTF8String];  
  4.     //使用对应的CC_SHA1,CC_SHA256,CC_SHA384,CC_SHA512的长度分别是20,32,48,64  
  5.     unsigned char digest[CC_SHA1_DIGEST_LENGTH];  
  6.     //使用对应的CC_SHA256,CC_SHA384,CC_SHA512  
  7.     CC_SHA1(cstr,  strlen(cstr), digest);  
  8.     NSMutableString* result = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];  
  9.     for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) {  
  10.         [result appendFormat:@"%02x", digest[i]];  
  11.     }  
  12.     return result;  
  13. }  

对应的值是:

明文是:欢迎光临JerryVon的博客
SHA1密文是:61c57ac563dd6c32eeb1253cc1c2844a98245125
SHA256密文是:f567a67bcd236aec065b47b23e14f25b23eeb8c61aa214002d985df07c9ecdde
SHA384密文是:59e36a5a7978d00a96b4e6af17fd47cbd60b17f294a13d0205f878d421f2443e091d8c124039919b5c2941673814f23f
SHA512密文是:69c13c9e442043aa76dd62bc99a2b6abab8d5bcce69ea4e69b23e86e13bcc0e5e2ba1827c7e50fbaf773e606ad0da793ab464a23feb25ca406f0e90fd189a83c


散列算法可以作为文件的唯一值作为比较,防止篡改,还可以作为其他算法的基础,比如先md5+base64算法。

还可以作为密码加密,但是有的网站已经出现了常用密码和MD5对应值表,所以其实传输的时候可以加一些随机串来干扰。


二.BASE64编码

可逆的算法

详细的算法可以在百度百科中查到,基本就是将3个8位转换程4个6位,并且补0然后查找BASE64编码表

图片中编码经常使用。

java代码

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. System.out.println((new sun.misc.BASE64Encoder()).encode("欢迎光临JerryVon的博客".getBytes()));  
  2. //加密串就是5qyi6L+O5YWJ5Li0SmVycnlWb27nmoTljZrlrqI=  
  3. System.out.println(new String((new BASE64Decoder()).decodeBuffer("5qyi6L+O5YWJ5Li0SmVycnlWb27nmoTljZrlrqI=")));  

Objective-C

使用第三方库,主要有GTMBase64;NSString+Base64,NSData+Base64 二种主流库,我选择google的GTMBase64来加解密

[objc]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. NSString* message =@"欢迎光临JerryVon的博客";  
  2. NSData* mData = [message dataUsingEncoding:NSUTF8StringEncoding];  
  3. if([mData length]>0){  
  4.         //data = [GTMBase64 encodeData:data];//编码  
  5.         NSString *base64EncodedString = [GTMBase64 stringByEncodingData:mData];  
  6.         NSString* origin_str=[[NSString alloc] initWithData:[GTMBase64 decodeString: base64EncodedString]encoding:NSUTF8StringEncoding];  
  7. }  



参考网站

在线加密解密(MD5,SHA1)工具箱:http://app.baidu.com.cn/app/enter?appid=228509

base64工具:http://app.baidu.com/app/enter?appid=284732

base64编码与原理分析:http://blog.csdn.net/caianye/article/details/7592806

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值