背景介绍:

服务器在传输数据前先进行RSA加密,然后在手机端进行RSA解密。

开发任务:

IOS客户端进行RSA解密

已知数据:

.net仅仅提供了公钥和私钥,但是格式为XML格式。格式如下:

公钥!!加密
private static string publickey = @"<RSAKeyValue><Modulus>loChDDauMkcVdcentrn123EttwW66zx8hcPQmSu3yaWKq3q7kCFhnbQv4+MfylbzekpweH8896WqDPNtTl+gIE6UCJckHXmGspJI9OXZ7zAtLVMB9nDoLhBeEqpNBC93ACkNyI29VN6YvqnVuIrxsputcb5MBcb4slmVeus6668=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";

私钥!!解密
private static string privatekey = @"<RSAKeyValue><Modulus>loChDDauMkcVdcentrn0SvEttwW66zx8hcPQmSu3yaWKq3q7kCFhnbQv4+MfylbzekpweHcziwWqDPNtTl+gIE6UCJckHXmGspJI9OXZ7zAtLVMB9nDoLhBeEqpNBC93ACkNyI29VN6YtyuVuIrxsputcb5MBcb4slmVeus2q5M=</Modulus><Exponent>AQAB</Exponent><P>0UENxry9MzrOo/tZboOiOLh8Z+7dUUgQqhAeBuR31Or4S/88b2A+HCCjwjpSqlV6eX13kJOoD+XNCBnZdr3+yw==</P><Q>uB+mtbKnAf6JcoRyCwIMs2S/KGU0IB53boj4KKSwsb/ffhg12346saekETWuRN8Rse5q8ExcFUmxMO7ZmYllWQ==</Q><DP>AjGLYmzyEspoBiIJYvYwSiXs7+36FfMKca3vkqTseKfp6GoJiSVaIVNaRBv2Z+CzgviEu1hA58HB73bN58fAFw==</DP><DQ>ont7+JghfUcMMDzlDwXOA3mCn7k/mKCKMMc6h1Negl2acoIXtusicihIRs+ibDCWQvjs8gXQtRCFB3OgHzf6cQ==</DQ><InverseQ>PFnyOHfoeraI+n6325ddKgIS6kY5ZWuguqmI+66XFZn+8Pq4gTIpXFhXZFBH/SYyNhWB2sOi94lhfdWcOwPX4A==</InverseQ><D>JUbx3M0UY2ag5Z3QqB0x6XgIOytjq009iIJCQhYGfR8QFD4fg+kIvR96tyaz4pGb19/lMKlRrm72OiP3IHDl/4kXmA7PUY4d3LoJTsXCrnJNQrPWD4DLs3iFpYWgymDqRFuVBv06OWjewXiEFDCybnlie6CahmL0q4EebYgIOTk=</D></RSAKeyValue>";

解决方案:

步骤一:XML-->PEM(参考http://bbs.csdn.net/topics/390913872),可以找.net帮忙转换

私钥:

var rsa = new RSACryptoServiceProvider();
using(var sr = new StreamReader("e:\\key.xml"))
{
    rsa.FromXmlString(sr.ReadToEnd());
}
var p = rsa.ExportParameters(true);

var key = new RsaPrivateCrtKeyParameters(
    new BigInteger(1, p.Modulus), new BigInteger(1, p.Exponent), new BigInteger(1, p.D),
    new BigInteger(1, p.P), new BigInteger(1, p.Q), new BigInteger(1, p.DP), new BigInteger(1, p.DQ), 
    new BigInteger(1, p.InverseQ));

using (var sw = new StreamWriter("e:\\key.pem"))
{
    var pemWriter = new Org.BouncyCastle.OpenSsl.PemWriter(sw);
    pemWriter.WriteObject(key);
}

公钥:

public static String ExportPublicKeyToPEMFormat(RSACryptoServiceProvider csp)
{
    TextWriter outputStream = new StringWriter();

var parameters = csp.ExportParameters(false);
    using (var stream = new MemoryStream())
    {
        var writer = new BinaryWriter(stream);
        writer.Write((byte)0x30); // SEQUENCE
        using (var innerStream = new MemoryStream())
        {
            var innerWriter = new BinaryWriter(innerStream);
            EncodeIntegerBigEndian(innerWriter, new byte[] { 0x00 }); // Version
            EncodeIntegerBigEndian(innerWriter, parameters.Modulus);
            EncodeIntegerBigEndian(innerWriter, parameters.Exponent);

//All Parameter Must Have Value so Set Other Parameter Value Whit Invalid Data  (for keeping Key Structure  use "parameters.Exponent" value for invalid data)
            EncodeIntegerBigEndian(innerWriter, parameters.Exponent); // instead of parameters.D
            EncodeIntegerBigEndian(innerWriter, parameters.Exponent); // instead of parameters.P
            EncodeIntegerBigEndian(innerWriter, parameters.Exponent); // instead of parameters.Q
            EncodeIntegerBigEndian(innerWriter, parameters.Exponent); // instead of parameters.DP
            EncodeIntegerBigEndian(innerWriter, parameters.Exponent); // instead of parameters.DQ
            EncodeIntegerBigEndian(innerWriter, parameters.Exponent); // instead of parameters.InverseQ

var length = (int)innerStream.Length;
            EncodeLength(writer, length);
            writer.Write(innerStream.GetBuffer(), 0, length);
        }

var base64 = Convert.ToBase64String(stream.GetBuffer(), 0, (int)stream.Length).ToCharArray();
        outputStream.WriteLine("-----BEGIN PUBLIC KEY-----");
        // Output as Base64 with lines chopped at 64 characters
        for (var i = 0; i < base64.Length; i += 64)
        {
            outputStream.WriteLine(base64, i, Math.Min(64, base64.Length - i));
        }
        outputStream.WriteLine("-----END PUBLIC KEY-----");

return outputStream.ToString();

}
}

private static void EncodeIntegerBigEndian(BinaryWriter stream, byte[] value, bool forceUnsigned = true)
{
    stream.Write((byte)0x02); // INTEGER
    var prefixZeros = 0;
    for (var i = 0; i < value.Length; i++)
    {
        if (value[i] != 0) break;
        prefixZeros++;
    }
    if (value.Length - prefixZeros == 0)
    {
        EncodeLength(stream, 1);
        stream.Write((byte)0);
    }
    else
    {
        if (forceUnsigned && value[prefixZeros] > 0x7f)
        {
            // Add a prefix zero to force unsigned if the MSB is 1
            EncodeLength(stream, value.Length - prefixZeros + 1);
            stream.Write((byte)0);
        }
        else
        {
            EncodeLength(stream, value.Length - prefixZeros);
        }
        for (var i = prefixZeros; i < value.Length; i++)
        {
            stream.Write(value[i]);
        }
    }
}

private static void EncodeLength(BinaryWriter stream, int length)
{
    if (length < 0) throw new ArgumentOutOfRangeException("length", "Length must be non-negative");
    if (length < 0x80)
    {
        // Short form
        stream.Write((byte)length);
    }
    else
    {
        // Long form
        var temp = length;
        var bytesRequired = 0;
        while (temp > 0)
        {
            temp >>= 8;
            bytesRequired++;
        }
        stream.Write((byte)(bytesRequired | 0x80));
        for (var i = bytesRequired - 1; i >= 0; i--)
        {
            stream.Write((byte)(length >> (8 * i) & 0xff));
        }
    }
}

经过转换,我们可以得到PEM格式的公钥和私钥,格式如下:

公钥:

-----BEGIN PUBLIC KEY——

MIGqAgEAAoGBAJaAoQw2rjJHFXXHp7a59ErxLbcFuus8fIXD0Jkrt8mliqt6u5Ah YZ20L+PjH8pW83pKcHh3M4sFqgzzbU5foCBOlAiXJB15hrKSSPTl2e8wLS1TAfZw 6C4QXhKqTQQvdwApDciNvVTemL6p1biK8bKbrXG+TAXG+LJZlXrrNquTAgMBAAEC

AwEAAQIDAQABAgMBAAECAwEAAQIDAQABAgMBAAE=

-----END PUBLIC KEY——

私钥:

-----BEGIN RSA PRIVATE KEY-----

MIICXAIBAAKBgQCWgKEMNq4yRxV1x6e2ufRK8S23BbrrPHyFw9CZK7fJpYqreruQ

IWGdtC/j4x/KVvN6SnB4dzOLBaoM821OX6AgTpQIlyQdeYaykkj05dnvMC0tUwH2

cOguEF4Sqk0EL3cAKQ3Ijb1U3pi+qdW4ivGym61xvkwFxviyWZV66zarkwIDAQAB

AoGAJUbx3M0UY2ag5Z3QqB0x6XgIOytjq009iIJCQhYGfR8QFD4fg+kIvR96tyaz

4pGb19/lMKlRrm72OiP3IHDl/4kXmA7PUY4d3LoJTsXCrnJNQrPWD4DLs3iFpYWg

ymDqRFuVBv06OWjewXiEFDCybnlie6CahmL0q4EebYgIOTkCQQDRQQ3GvL0zOs6j

+1lug6I4uHxn7t1RSBCqEB4G5HfU6vhL/zxvYD4cIKPCOlKqVXp5fXeQk6gP5c0I

Gdl2vf7LAkEAuB+mtbKnAf6JcoRyCwIMs2S/KGU0IB53boj4KKSwsb/ffhg2ty36

saekETWuRN8Rse5q8ExcFUmxMO7ZmYllWQJAAjGLYmzyEspoBiIJYvYwSiXs7+36

FfMKca3vkqTseKfp6GoJiSVaIVNaRBv2Z+CzgviEu1hA58HB73bN58fAFwJBAKJ7

e/iYIX1HDDA85Q8FzgN5gp+5P5igijDHOodTXoJdmnKCF7brInIoSEbPomwwlkL4

7PIF0LUQhQdzoB83+nECQDxZ8jh36Hq2iPp37yInXSoCEupGOWVroLqpiPuulxWZ

/vD6uIEyKVxYV2RQR/0mMjYVgdrDoveJBkx1nDsD1+A=

-----END RSA PRIVATE KEY——

步骤二:生成私钥pem文件

1.打开终端,输入  “openssl genrsa -out private_key.pem 1024"

2.打开Finder,在【这台Mac】查找".pem",应该可以看到 private_key.pem。

3.选中private_key.pem , 选择用文本编辑的方式打开

4.将里面的内容替换成你的私钥

步骤三:生成公钥pem文件

1.在终端输入

openssl rsa -in private_key.pem -pubout -out public_key.pem

2.打开Finder,在【这台Mac】查找".pem",应该可以看到 public_key.pem.

3.选中public_key.pem , 选择用文本编辑的方式打开

4.将里面的内容替换成你的公钥

步骤四:demo测试(参考:https://github.com/jslim89/RSA-objc)

打开demo,会有报错,

step01:添加必要的文件(把工程里红色的文件加进来)

step02:全局替换:把”#include<openssl/“  替换成 ”#include <“

step03:全局替换:把”# include <openssl/“  替换成 ”#include <“

步骤五:代码接入到自己的项目

IOS RSA加密解密相关推荐

  1. ios android rsa加密解密,IOS RSA加密解密

    最近项目中对接口进行了rsa 加密. 写下过程以便复习 公钥私钥一般是有后台给的,这里为了方便 自己生成一对秘钥 生成公钥 私钥. 终端中: 生成原始 RSA私钥文件 private_key.pem ...

  2. iOS使用Security.framework进行RSA 加密解密签名和验证签名

    iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...

  3. ios php rsa加密解密,php rsa加密解密使用详解

    第一条命令生成原始 RSA私钥文件 rsa_private_key.pem,第二条命令将原始 RSA私钥转换为 pkcs8格式,第三条生成RSA公钥 rsa_public_key.pem 从上面看出通 ...

  4. IOS之RSA加密解密与后台之间的双向加密详解

    IOS之RSA加密解密与后台之间的双向加密详解 序言 因为项目中需要用到RSA加密,刚开始也是有点乱,这两天也整理的差不多了,希望能帮到大家. 这次先上代码,我想大部分人肯定是着急解决问题,所以不要废 ...

  5. C#的RSA加密解密签名,就为了支持PEM PKCS#8格式密钥对的导入导出

    差点造了一整个轮子 .Net Framework 4.5 里面的RSA功能,并未提供简单对PEM密钥格式的支持(.Net Core有咩?),差点(还远着)造了一整个轮子,就为了支持PEM PKCS#8 ...

  6. iOS RSA加密 以及生成公钥 秘钥 pem文件

    在iOS中使用RSA加密解密,需要用到.der和.p12后缀格式的文件,其中.der格式的文件存放的是公钥(Public key)用于加密,.p12格式的文件存放的是私钥(Private key)用于 ...

  7. python rsa加密解密_RSA加密解密(python版)

    RSA的算法涉及三个参数,n.e.d. 其中,n是两个大质数p.q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度. e1和d是一对相关的值,e可以任意取,但要求e与(p-1)*(q-1)互质: ...

  8. Crypto++安装和简单使用RSA加密解密

    Crypto++安装和简单使用 一.前言 二.下载 三.安装 四.使用 五.RSA加密/解密 (一)生成密钥/公钥 (二)OAEP加密/解密 六.RSA加密/解密的源码 一.前言 能搜索这个的估计都知 ...

  9. OC RSA加密解密

    好久好久没有更新了...你们等的急不急..这不,我就姗姗来迟了...本文重点讲解一下iOS系统下的RSA加密解密问题. 一般为了安全,私钥是不会给前端暴露出来 的,只会通过私钥生成一个公开的公钥提供给 ...

最新文章

  1. [转载] linux、Solaris下xdmcp远程桌面服务
  2. ios4.2文件夹及多任务
  3. BZOJ 2142 礼物(拓展Lucas,中国剩余定理)【BZOJ修复工程】
  4. 利用dsamain.exe挂载快照(活动目录快照配置管理系列四)
  5. C语言读写配置文件--转载
  6. 【贪心】小Y的炮[cannon]题解
  7. java实现telnet和ssh客户端
  8. Java14-day05【集合(Collection常用方法-遍历、List特有方法、List集合子类特点、LinkedList集合的特有功能、ListIterator)】
  9. 后端技术:阿里开源的接口限流神器Sentinel介绍
  10. gensim读取已训练模型LDA模型的模型与dictionary
  11. 太拼了!张朝阳的一张作息表刷爆朋友圈
  12. 量化交易中N字型技术形态的实现,天勤,mindgo,python版同花顺,okex,huobi,binance等平台都可正常使用
  13. 搜狗高级测试经理诸葛东明谈基于AI图像识别的输入法性能测试实践
  14. Opengl三视图的坐标变换
  15. java基础知识精华总结集合
  16. 01背包一维dp数组的实现
  17. TIA博途下载PLC程序时提示“具有激活的TIS功能防止下载到设备”错误-处理办法
  18. HTML_04_表单_框架
  19. Win7家庭普通版、家庭高级版、专业版、旗舰版版本差别
  20. Spring 整合 Apache Shiro 实现各等级的权限管理

热门文章

  1. linux通过GRUP引导多操作系统时USB键盘不可使用,导致无数选择其他系统
  2. 未名之光MeGauging(实现一个轻量级的机器视觉软件,九大神奇)
  3. 解决Word中公式与中文文字横向间距的问题
  4. java中的final变量
  5. WPF Expander控件使用
  6. 苹果电脑一直弹框 无法打开“文件”,因为Apple无法检查其是否包含恶意软件。
  7. 汤姆大叔深入理解JavaScript 学习笔记
  8. code ELIFECYCLE报错
  9. ABAP QUAN类型和标准P类型转换关系
  10. java反射传递参数_Java反射 调用传参