文档章节

.net 安卓IOS跨平台des加解密双向的(可以互相加解密)

壹峰
 壹峰
发布于 2018/07/25 11:19
字数 803
阅读 6
收藏 0

http://blog.sina.com.cn/s/blog_beda09820102v5fu.html

.net 安卓IOS跨平台des加解密双向的(可以互相加解密)

 

#region   跨平台加解密(c# 安卓 IOS)

      //  public static string sKey = "12345678";

      //  /// 

      //  /// 解密

      //  /// 

      //  /// 要解密的以Base64

      //  /// 密钥,且必须为8位

      //  /// 已解密的字符串

      //  public static string DesDecrypt(string pToDecrypt)

      //  {

      //      //转义特殊字符

      //      pToDecrypt = pToDecrypt.Replace("-", "+");

      //      pToDecrypt = pToDecrypt.Replace("_", "/");

      //      pToDecrypt = pToDecrypt.Replace("~", "=");

      //      byte[] inputByteArray = Convert.FromBase64String(pToDecrypt);

      //      using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())

      //      {

      //          des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);

      //          des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);

      //          System.IO.MemoryStream ms = new System.IO.MemoryStream();

      //          using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))

      //          {

      //              cs.Write(inputByteArray, 0, inputByteArray.Length);

      //              cs.FlushFinalBlock();

      //              cs.Close();

      //          }

      //          string str = Encoding.UTF8.GetString(ms.ToArray());

      //          ms.Close();

      //          return str;

      //      }

      //  }

 

      //  /// 

      //  /// 对字符串进行DES加密

      //  /// 

      //  /// 待加密的字符串

      //  /// 加密后的BASE64编码的字符串

      //  public string Encrypt(string sourceString)

      //{

      //   byte[] btKey = Encoding.UTF8.GetBytes(sKey);

      //   byte[] btIV = Encoding.UTF8.GetBytes(sKey);

      //    DESCryptoServiceProvider des = new DESCryptoServiceProvider();

      //    using (MemoryStream ms = new MemoryStream())

      //    {

      //        byte[] inData = Encoding.UTF8.GetBytes(sourceString);

      //        try

      //        {

      //            using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(btKey, btIV), CryptoStreamMode.Write))

      //            {

      //                cs.Write(inData, 0, inData.Length);

      //                cs.FlushFinalBlock();

      //            }

 

      //            return Convert.ToBase64String(ms.ToArray());

      //        }

      //        catch

      //        {

      //            throw;

      //        }

      //    }

      //}

        

        #endregion  

 

 

 

 

安卓---------------------------------------------------------------------------

    //    // 加密

    //public static String DecryptDoNet(String message, String key)

    //        throws Exception {

    //    byte[] bytesrc = Base64.decode(message.getBytes(), Base64.DEFAULT);

    //    Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

    //    DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));

    //    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

    //    SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

    //    IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));

    //    cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);

    //    byte[] retByte = cipher.doFinal(bytesrc);

    //    return new String(retByte);

    //}

 

    //// 解密

    //public static String EncryptAsDoNet(String message, String key)

    //        throws Exception {

    //    Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

    //    DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));

    //    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

    //    SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

    //    IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));

    //    cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);

    //    byte[] encryptbyte = cipher.doFinal(message.getBytes());

    //    return new String(Base64.encode(encryptbyte, Base64.DEFAULT));

    //}

 

 

 

Ios --------------------------------------------------------------------------------------------------------------------\

static const char* encryptWithKeyAndType(const char *text,CCOperation encryptOperation,char *key)
{
    NSString *textString=[[NSString alloc]initWithCString:text encoding:NSUTF8StringEncoding];
    //      NSLog(@"[[item.url description] UTF8String=%@",textString);
    const void *dataIn;
    size_t dataInLength;
    
    if (encryptOperation == kCCDecrypt)//传递过来的是decrypt 解码
    {
        //解码 base64
        NSData *decryptData = [GTMBase64 decodeData:[textString dataUsingEncoding:NSUTF8StringEncoding]];//转成utf-8并decode
        dataInLength = [decryptData length];
        dataIn = [decryptData bytes];
    }
    else  //encrypt
    {
        NSData* encryptData = [textString dataUsingEncoding:NSUTF8StringEncoding];
        dataInLength = [encryptData length];
        dataIn = (const void *)[encryptData bytes];
    }
    
    
    CCCryptorStatus ccStatus;
    uint8_t *dataOut = NULL; //可以理解位type/typedef 的缩写(有效的维护了代码,比如:一个人用int,一个人用long。最好用typedef来定义)
    size_t dataOutAvailable = 0; //size_t  是操作符sizeof返回的结果类型
    size_t dataOutMoved = 0;
    
    dataOutAvailable = (dataInLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
    dataOut = malloc( dataOutAvailable * sizeof(uint8_t));
    memset((void *)dataOut, 00, dataOutAvailable);//将已开辟内存空间buffer的首 1 个字节的值设为值 0
    
    //NSString *initIv = @"12345678";
    const void *vkey = key;
    const void *iv = (const void *) key; //[initIv UTF8String];
    
    //CCCrypt函数 加密/解密
    ccStatus = CCCrypt(encryptOperation,//  加密/解密
                       kCCAlgorithmDES,//  加密根据哪个标准(des,3des,aes。。。。)
                       kCCOptionPKCS7Padding,//  选项分组密码算法(des:对每块分组加一次密  3DES:对每块分组加三个不同的密)
                       vkey,  //密钥    加密和解密的密钥必须一致
                       kCCKeySizeDES,//   DES 密钥的大小(kCCKeySizeDES=8)
                       iv, //  可选的初始矢量
                       dataIn, // 数据的存储单元
                       dataInLength,// 数据的大小
                       (void *)dataOut,// 用于返回数据
                       dataOutAvailable,
                       &dataOutMoved);
    
    NSString *result = nil;
    
    if (encryptOperation == kCCDecrypt)//encryptOperation==1  解码
    {
        //得到解密出来的data数据,改变为utf-8的字符串
        result = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved] encoding:NSUTF8StringEncoding];
    }
    else //encryptOperation==0  (加密过程中,把加好密的数据转成base64的)
    {
        //编码 base64
        NSData *data = [NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved];
        result = [GTMBase64 stringByEncodingData:data];
    }
    
    return [result UTF8String];
    
}
+(NSString*)encryptWithContent:(NSString*)content type:(CCOperation)type key:(NSString*)aKey
{
    const char * contentChar =[content UTF8String];
    char * keyChar =(char*)[aKey UTF8String];
    const char *miChar;
    miChar = encryptWithKeyAndType(contentChar, type, keyChar);
    return  [NSString stringWithCString:miChar encoding:NSUTF8StringEncoding];
}

本文转载自:http://blog.sina.com.cn/s/blog_beda09820102v5fu.html

壹峰
粉丝 9
博文 595
码字总数 9582
作品 0
广州
其他
私信 提问
Objective-C 和 Java 下 DES加解密保持一致的方式

最近做了一个移动项目,是有服务器和客户端类型的项目,客户端是要登录才行的,登录的密码要用DES加密,服务器是用Java开发的,客户端要同时支持多平台(Android、iOS),在处理iOS的DES加密...

山哥
2012/04/19
0
5
求教ios和java之间的rsa加密解密

http://www.apkbus.com/android-130698-1-1.html我的后台是用这个加密解密的,我用这个下面的ios网址加 密的http://blog.yorkgu.me/2011/10/27/rsa-in-ios-using-publick-key- generated-by......

进击的IOS
2014/05/27
617
0
iOS中DES与MD5加密方案

MD5算法和DES算法是常见的两种加密算法。 MD5:MD5是一种不可逆的加密算法,按我的理解,所谓不可逆,就是不能解密,那么它有什么用的,它的用处大了,大多数的登录功能都会使用到这种算法。...

珲少
2015/04/03
0
0
关于DES加密,密钥和待加密串相同,在android版本和IOS版本得到不同的密文,怎么破?

背景:业务要跟后台系统交互,对信息加密,APP有IOS和android两版本,所以算法必须一致。在用同样的密钥和加密内容进行加密后,得出的密文不同。 我找了些资料,也有很多人遇到。 导致密文不...

andywster
2014/02/13
3.7K
3
苹果、三星出言安抚用户:CIA 攻击工具威胁不大

据《金融时报》报道,在维基解密披露美国中央情报局(以下简称 “CIA”)利用恶意件攻击各种设备后,苹果表示,它在密切注意有关更多 iPhone 安全缺陷的消息,三星则开始对其智能手机和智能电视...

局长
2017/03/09
2.2K
10

没有更多内容

加载失败,请刷新页面

加载更多

lua web快速开发指南(7) - 高效的接口调用 - httpc库

httpc库基于cf框架都内部实现的socket编写的http client库. httpc库内置SSL支持, 在不使用代理的情况下就可以请求第三方接口. httpc支持header、args、body、timeout请求设置, 完美支持各种h...

水果糖的小铺子
今天
3
0
通过四道常问面试题,带你了解什么是数据库分库分表

编者语:为了避免被误解为:「手里有把锤子,看什么都是钉子!」,说明一下不是什么业务都适合分布式数据库,更不是用了分布式数据库性能就一定能得到扩展。 其次:本文为纯干货,建议先转发...

老道士
今天
6
0
springmvc 整体流程

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR......

architect刘源源
今天
3
0
磁盘管理

先来看两个查看的命令 查看磁盘使用情况df 用法:df, df -h, df -m, df -k 查看目录或文件大小 用法:du -sh, du -sm, du -s(默认以k为单位) 新加一块盘如何操作 步骤:分区(可选)--> 格...

wzb88
今天
3
0
在 Linux 下确认 NTP 是否同步的方法

NTP 意即网络时间协议Network Time Protocol,它通过网络同步计算机系统之间的时钟。NTP 服务器可以使组织中的所有服务器保持同步,以准确时间执行基于时间的作业。NTP 客户端会将其时钟与 ...

Linux就该这么学
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部