ios 中 使用mod和exp生成公钥(.cer)
来源:互联网 发布:威斯盾断桥铝 知乎 编辑:程序博客网 时间:2024/05/02 01:43
最近一直在解决RSA加密方面的,看了网上不少教程。大部分都是基于.cer文件进行加密的,而在我们的项目中服务器端只返回两个值分别是mod和exp。经过分析对比数据,发现实际上.cer文件就是由这两个数据组合得到的。文件格式如下:
0x30 包长 { 0x02 包长 { mod 0x02 包长 { exp } } }
包长用来记录后面大括号表示的包占用字节数 len
在cer文件中,包长由1-3个字节组成:
- 当包长小于128位时长度为1,该字节值等于 len
- 128-255之间长度为2, 分别为 0x81 , len
- 大于255长度为3,分别为 0x82 ,len>>8 , len
(理论上大于65535时应为4,未验证该结果)
代码如下
-(NSData *)cerWithMod:(NSData *)modBits exp:(NSData *)expBits{ if(!(mod && exp)){ @throw [NSException exceptionWithName:@"NSInvalidArgumentException" reason:@"Data not set." userInfo:nil]; } //整个证书分为8个部分 //创建证书存储空间,其中第二第四部分包长按照1byte处理 NSMutableData *fullKey = [[NSMutableData alloc] initWithLength:6+[modBits length]+[expBits length]]; unsigned char *fullKeyBytes = [fullKey mutableBytes]; unsigned int bytep = 0; // current byte pointer /** * 0x30 包长 { 0x02 包长 { modBits 0x02 包长 { expBits } } } */ //第一部分:(1 byte)固定位0x30 fullKeyBytes[bytep++] = 0x30; //第二部分:(1-3 byte)记录包长 unsigned int ml = 4+[modBits length]+[expBits length]; if (ml >= 256) { //当长度大于256时占用 3 byte fullKeyBytes[bytep++] = 0x82; fullKeyBytes[bytep++] = ml >> 8; [fullKey increaseLengthBy:2]; }else if(ml >= 128) { //当长度大于128时占用 2 byte fullKeyBytes[bytep++] = 0x81 ; [fullKey increaseLengthBy:1]; } //处理最后一个 byte unsigned int seqLenLoc = bytep; fullKeyBytes[bytep++] = 4+[modBits length]+[expBits length]; //第三部分 (1 byte)固定位0x02 fullKeyBytes[bytep++] = 0x02; //第四部分:(1-3 byte)记录包长 ml = [modBits length]; if (ml >= 256) { //当长度大于256时占用 3 byte fullKeyBytes[bytep++] = 0x82; //第二部分包长+1 fullKeyBytes[seqLenLoc] += 2; fullKeyBytes[bytep++] = ml >> 8; [fullKey increaseLengthBy:2]; }else if(ml >= 128){ //当长度大于256时占用 2 byte fullKeyBytes[bytep++] = 0x81 ; //第二部分包长+2 fullKeyBytes[seqLenLoc]++; [fullKey increaseLengthBy:1]; } //处理最后一个 byte fullKeyBytes[bytep++] = [modBits length]; //第五部分 [modBits getBytes:&fullKeyBytes[bytep]]; bytep += [modBits length]; //第六部分 fullKeyBytes[bytep++] = 0x02; //第七部分 fullKeyBytes[bytep++] = [expBits length]; //第八部分 [expBits getBytes:&fullKeyBytes[bytep++]]; return fullKey;}
0 0
- ios 中 使用mod和exp生成公钥(.cer)
- PHP中使用CER公钥的方法
- 公钥证书cer,pfx
- oracle中exp使用
- java 调用 keytool 生成keystore 和 cer 证书
- java 调用 keytool 生成keystore 和 cer 证书
- java 调用 keytool 生成keystore 和 cer 证书
- java 调用 keytool 生成keystore 和 cer 证书
- java 调用 keytool 生成keystore 和 cer 证书
- JAVA调用 keytool 生成keystore 和 cer 证书
- iOS开发实现HTTPS之 cer 文件的使用
- iOS开发中使用CIFilter生成二维码和条形码
- oracle数据库中使用imp和exp命令
- Oracle中exp和imp的使用详解
- 使用IE导入和导出cer和crt格式证书
- 在Android应用中使用自定义证书,CER转BKS
- oracle中exp/emp使用
- exp和expdp的使用
- 解决方案:httpd: Could not reliably determine the server's fully qualified domain name
- 最流行的android组件大全 .
- QxOrm的学习使用
- ios 画图总结
- Linux 使用usb转串口作为调试串口
- ios 中 使用mod和exp生成公钥(.cer)
- iOS锁屏显示歌曲信息
- 常用谷歌地址和常用搜索引擎
- FFMPEG视音频编解码零基础学习方法
- PHP 命名空间 入门
- JSP中的include的两种用法
- Dungeon Game
- pthread_detach
- 在DLL文件中加入版本信息、描述信息的方法