Windows 8 系列(四):Win8 RSA加密相关问题
2012-05-16 13:26
176 查看
最近好久没有发win8系列的文章了,这段时间工作中积累了一些经验和问题,现在拿出来跟大家分享一下。
关于RSA加密算法,在Win8中用起来不太方便。不像其他平台一样导入证书文件或者导入N值、E值,而是需要导入ASC码数据。据说windows phone中也一样,需要把密钥中的信息解析成ASC码,组成数组,用AsymmetricKeyAlgorithmProvider.ImportPublicKey()方法才能导入。相关代码如下:(nBytes就是ASC码数据,类型为byte[])
在Windows Phone中,直接导入由密钥产生的数组就可以,但是Win8上总是提示失败,编译不过,提示ASN1 bad tag value met.。如下图:
由于目前Win8和相关参考资料较少,还没有多少开发者真正的遇到过这些问题,所以,我的同事只能从一些其他平台的RSA数据包的例子中参考,经过近一天时间的查找,终于在一次测试中通过了,解决办法是在原密钥ASC码数组的前面加入了“82, 83, 65, 49, 0, 4, 0, 0, 3, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1,”这一段ASC码值,将这一串ASC码转换成字符后是
这个相当于是一个信息头。
面对无资料可循的问题,我们能够解决这个问题,实属不易,如果没有遇到那个例子,不知道何时才能解决这个问题。这个问题虽然暂时解决了,但是我们并没有找到解决这个问题的根本办法,如果这个问题以后再次出现,我们就不知道还得“试”到什么时候
担心的事情终究是发生了,在安装了最新发布的Win8系统升级包后,这里报错了。起初我们还以为是API变化导致的,可是我们看了API文档后没有找到相关可以解决的办法,最后我们求助了微软,想知道是系统的问题,还是API的问题,还是我们自己的问题。
我们再次在这个问题上花费了将近两天的时间,终于在 @马蔬菜(新浪微博)的帮助下,我们走入了正途,他发现API中有个CreateKeyPair方法,可以创建指定长度的Key,于是,我们用这个方法同时创建了两个Key,对比他们的相同之处,把它们加入到我们的密钥数组中,不就OK了吗?
于是我们用了以下代码:
这里需要说明一下,为什么我们创建了1024的,而不是其他的长度呢,我们发现我们的密钥在转换成IBuffer对象后的长度是128,1024的key转换成IBuffer后是162,最接近128,因此应该是会有38位的“头”和“尾”。
查看newBuffer和newBuffer2的差异后,我们发现头和尾分别有部分数组元素是一样的,我们把它们加入到我们的密钥数组中,再次运行ImportPublicKey()方法,执行通过。至此,我们的RSA加密问题终于解决了,而且是彻底解决了,如果以后这里再报错,就可以还拿上面这段代码比较相同的部分,得出“头”和“尾”。
以上是我们工作中遇到的问题和相关的解决方案,希望能够帮助到大家。
关于RSA加密算法,在Win8中用起来不太方便。不像其他平台一样导入证书文件或者导入N值、E值,而是需要导入ASC码数据。据说windows phone中也一样,需要把密钥中的信息解析成ASC码,组成数组,用AsymmetricKeyAlgorithmProvider.ImportPublicKey()方法才能导入。相关代码如下:(nBytes就是ASC码数据,类型为byte[])
在Windows Phone中,直接导入由密钥产生的数组就可以,但是Win8上总是提示失败,编译不过,提示ASN1 bad tag value met.。如下图:
由于目前Win8和相关参考资料较少,还没有多少开发者真正的遇到过这些问题,所以,我的同事只能从一些其他平台的RSA数据包的例子中参考,经过近一天时间的查找,终于在一次测试中通过了,解决办法是在原密钥ASC码数组的前面加入了“82, 83, 65, 49, 0, 4, 0, 0, 3, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1,”这一段ASC码值,将这一串ASC码转换成字符后是
这个相当于是一个信息头。
面对无资料可循的问题,我们能够解决这个问题,实属不易,如果没有遇到那个例子,不知道何时才能解决这个问题。这个问题虽然暂时解决了,但是我们并没有找到解决这个问题的根本办法,如果这个问题以后再次出现,我们就不知道还得“试”到什么时候
担心的事情终究是发生了,在安装了最新发布的Win8系统升级包后,这里报错了。起初我们还以为是API变化导致的,可是我们看了API文档后没有找到相关可以解决的办法,最后我们求助了微软,想知道是系统的问题,还是API的问题,还是我们自己的问题。
我们再次在这个问题上花费了将近两天的时间,终于在 @马蔬菜(新浪微博)的帮助下,我们走入了正途,他发现API中有个CreateKeyPair方法,可以创建指定长度的Key,于是,我们用这个方法同时创建了两个Key,对比他们的相同之处,把它们加入到我们的密钥数组中,不就OK了吗?
于是我们用了以下代码:
CryptographicKey keyPair = Algorithm.CreateKeyPair(1024); CryptographicKey keyPair2 = Algorithm.CreateKeyPair(1024); var blobOfPublicKey = keyPair.ExportPublicKey(); var blobOfPublicKey2 = keyPair2.ExportPublicKey(); byte[] newBuffer, newBuffer2; CryptographicBuffer.CopyToByteArray(blobOfPublicKey, out newBuffer); CryptographicBuffer.CopyToByteArray(blobOfPublicKey2, out newBuffer2);
这里需要说明一下,为什么我们创建了1024的,而不是其他的长度呢,我们发现我们的密钥在转换成IBuffer对象后的长度是128,1024的key转换成IBuffer后是162,最接近128,因此应该是会有38位的“头”和“尾”。
查看newBuffer和newBuffer2的差异后,我们发现头和尾分别有部分数组元素是一样的,我们把它们加入到我们的密钥数组中,再次运行ImportPublicKey()方法,执行通过。至此,我们的RSA加密问题终于解决了,而且是彻底解决了,如果以后这里再报错,就可以还拿上面这段代码比较相同的部分,得出“头”和“尾”。
以上是我们工作中遇到的问题和相关的解决方案,希望能够帮助到大家。
相关文章推荐
- windows开发常见问题系列--2 鼠标键盘输入相关
- Windows 8 系列(五):Windows App Cer Kit(Certification Kit)的使用与相关问题
- ios RSA加密解密一些相关问题
- windows开发常见问题系列--1 窗口显示相关
- Android客户端与服务器端RSA加密通讯加密字符不一致相关问题
- Windows 8 系列(十):关于AppBar持久显示的相关问题
- Windows10下配置OpenSSL,并进行RSA加密
- 因计算机磁盘硬件配置问题windows无法启动及HP系列机器不能使用GHOST的解决方法
- Docker问答录系列——Docker引擎相关问题(五)
- 《Windows 系列》- 解决功能丢失问题
- Windows环境中编译opencv3.0同时加入OpenCV_contrib库及解决遇到相关问题
- Java使用密钥库相关问题(AES加密)
- ubuntu装机相关设定及问题系列(5)
- Android RSA加密 在服务端进行RSA解密不成功的问题
- Java安全系列-RSA加密
- 解决ArcGIS 10.1系列软件安装运行的相关问题
- 解决Windows 7下安装Oracle 11g相关问题的方法
- 蹭热点,聊聊区块链和加密货币相关的安全问题
- python下RSA加密解密以及跨平台问题