obj c和java_PKCS1-padding / RSA加密ios objc和java之间的区别
我正在为ios和Android开发应用程序。我对加密任务相对来说比较陌生,在过去的3天里,由于无法运行RSA加密,所以我一直在抨击我的头部。
两个客户端都从java服务器接收公钥。在Android中我有(显然,因为它几乎与服务器端的代码相同)没有问题,但是ios部分似乎根本不兼容。我想用公钥来加密一小段数据(aes key),这就是我在Java中如何做到的:
try {
String publickey = "MCwwDQYJKoZIhvcNAQEBBQADGwAwGAIRAK+dBpbOKw+1VKMWoFxjU6UCAwEAAQ==";
byte[] bArr = Crypto.base64Decode(publicKey, false);
KeyFactory keyFactory = KeyFactory.getInstance("RSA", "BC");
EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKey);
PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);
Cipher cipher = Cipher.getInstance("RSA/NONE/PKCS1Padding", "BC");
cipher.init(1,publicKey);
int cipherBlockSize = cipher.getBlockSize();
ByteArrayOutputStream bArrOut = new ByteArrayOutputStream();
bArrOut.flush();
int pos = 0;
Log.i("ContentBufferLength", contentBuffer.length+"");
while (true) {
if (cipherBlockSize > contentBuffer.length - pos) {
cipherBlockSize = contentBuffer.length - pos;
}
Log.i("CipherBlockSize", cipherBlockSize+"");
byte[] tmp = cipher.doFinal(contentBuffer, pos, cipherBlockSize);
bArrOut.write(tmp);
pos += cipherBlockSize;
if (contentBuffer.length <= pos) {
break;
}
}
bArrOut.flush();
encryptedBuffer = bArrOut.toByteArray();
bArrOut.close();
} catch (Exception ex) {
throw ex;
}
// Log.i("Encrypted Buffer Length", encryptedBuffer.length+"");
return encryptedBuffer;这是我的(不正常工作)ios代码,从这里借用:
http://blog.wingsofhermes.org/?p=75和苹果加密练习。
-(NSString* )encryptWithPublicKey:(NSString*)key input:(NSString*) input {
const size_t BUFFER_SIZE = 16;
const size_t CIPHER_BUFFER_SIZE = 16;
//const uint32_t PADDING = kSecPaddingNone;
const uint32_t PADDING = kSecPaddingPKCS1;
static const UInt8 publicKeyIdentifier[] = "de.irgendwas.app";
NSData *publicTag;
publicTag = [[NSData alloc] initWithBytes:publicKeyIdentifier length:sizeof(publicKeyIdentifier)];
NSMutableDictionary *publicKey2 = [[NSMutableDictionary alloc] init];
[publicKey2 setObject:kSecClassKey forKey:kSecClass];
[publicKey2 setObject:kSecAttrKeyTypeRSA forKey:kSecAttrKeyType];
[publicKey2 setObject:publicTag forKey:kSecAttrApplicationTag];
SecItemDelete((CFDictionaryRef)publicKey2);
NSData *strippedPublicKeyData = [NSData dataFromBase64String:key];
unsigned char * bytes = (unsigned char *)[strippedPublicKeyData bytes];
size_t bytesLen = [strippedPublicKeyData length];
size_t i = 0;
if (bytes[i++] != 0x30)
[Exception raise:FAILURE function:__PRETTY_FUNCTION__ line:__LINE__ description:@"Could not set public key."];
/* Skip size bytes */
if (bytes[i] > 0x80)
i += bytes[i] - 0x80 + 1;
else
i++;
if (i >= bytesLen)
[Exception raise:FAILURE function:__PRETTY_FUNCTION__ line:__LINE__ description:@"Could not set public key."];
if (bytes[i] != 0x30)
[Exception raise:FAILURE function:__PRETTY_FUNCTION__ line:__LINE__ description:@"Could not set public key."];
/* Skip OID */
i += 15;
if (i >= bytesLen - 2)
[Exception raise:FAILURE function:__PRETTY_FUNCTION__ line:__LINE__ description:@"Could not set public key."];
if (bytes[i++] != 0x03)
[Exception raise:FAILURE function:__PRETTY_FUNCTION__ line:__LINE__ description:@"Could not set public key."];
/* Skip length and null */
if (bytes[i] > 0x80)
i += bytes[i] - 0x80 + 1;
else
i++;
if (i >= bytesLen)
[Exception raise:FAILURE function:__PRETTY_FUNCTION__ line:__LINE__ description:@"Could not set public key."];
if (bytes[i++] != 0x00)
[Exception raise:FAILURE function:__PRETTY_FUNCTION__ line:__LINE__ description:@"Could not set public key."];
if (i >= bytesLen)
[Exception raise:FAILURE function:__PRETTY_FUNCTION__ line:__LINE__ description:@"Could not set public key."];
strippedPublicKeyData = [NSData dataWithBytes:&bytes[i] length:bytesLen - i];
DLog(@"X.509 Formatted Public Key bytes:\n%@",[strippedPublicKeyData description]);
if (strippedPublicKeyData == nil)
[Exception raise:FAILURE function:__PRETTY_FUNCTION__ line:__LINE__ description:@"Could not set public key."];
CFTypeRef persistKey = nil;
[publicKey2 setObject:strippedPublicKeyData forKey:kSecValueData];
[publicKey2 setObject: (kSecAttrKeyClassPublic) forKey:kSecAttrKeyClass];
[publicKey2 setObject:[NSNumber numberWithBool:YES] forKey:kSecReturnPersistentRef];
OSStatus secStatus = SecItemAdd((CFDictionaryRef)publicKey2, &persistKey);
if (persistKey != nil) CFRelease(persistKey);
if ((secStatus != noErr) && (secStatus != errSecDuplicateItem))
[Exception raise:FAILURE function:__PRETTY_FUNCTION__ line:__LINE__ description:@"Could not set public key."];
SecKeyRef keyRef = nil;
[publicKey2 removeObjectForKey:kSecValueData];
[publicKey2 removeObjectForKey:kSecReturnPersistentRef];
[publicKey2 setObject:[NSNumber numberWithBool:YES] forKey:kSecReturnRef];
[publicKey2 setObject: kSecAttrKeyTypeRSA forKey:kSecAttrKeyType];
SecItemCopyMatching((CFDictionaryRef)publicKey2,(CFTypeRef *)&keyRef);
if (!keyRef)
[Exception raise:FAILURE function:__PRETTY_FUNCTION__ line:__LINE__ description:@"Could not set public key."];
uint8_t *plainBuffer;
uint8_t *cipherBuffer;
uint8_t *decryptedBuffer;
const char inputString[] = "1234";
int len = strlen(inputString);
// TODO: this is a hack since i know inputString length will be less than BUFFER_SIZE
if (len > BUFFER_SIZE) len = BUFFER_SIZE-1;
plainBuffer = (uint8_t *)calloc(BUFFER_SIZE, sizeof(uint8_t));
cipherBuffer = (uint8_t *)calloc(CIPHER_BUFFER_SIZE, sizeof(uint8_t));
decryptedBuffer = (uint8_t *)calloc(BUFFER_SIZE, sizeof(uint8_t));
strncpy( (char *)plainBuffer, inputString, len);
size_t plainBufferSize = strlen((char *)plainBuffer);
size_t cipherBufferSize = CIPHER_BUFFER_SIZE;
NSLog(@"SecKeyGetBlockSize() public = %lu", SecKeyGetBlockSize(keyRef));
// Error handling
// Encrypt using the public.
OSStatus status = noErr;
status = SecKeyEncrypt(keyRef,
PADDING,
plainBuffer,
plainBufferSize,
&cipherBuffer[0],
&cipherBufferSize
);
NSLog(@"encryption result code: %ld (size: %lu)", status, cipherBufferSize);
return [[[NSString stringWithFormat:@"%s",cipherBuffer] dataUsingEncoding:NSUTF8StringEncoding] base64EncodedString];
}出于测试目的和当下的简单性,我试图仅加密长度为4个字节的输入。这应该足够小以适应一个街区。公钥导入和加密过程似乎可行,但与android方法相比,我总是可以获得更长的输出。
我到目前为止遇到的唯一区别是,SecKeyGetBlockSize returns 16和java cipher.blocksize返回5.我认为其他11个字节是为pkcs1填充保留的,但是如何强制ios/objc中的相同行为?
obj c和java_PKCS1-padding / RSA加密ios objc和java之间的区别相关推荐
- ios php rsa,RSA 加密 iOS
在iOS端使用RSA加密的记录 一.需求: SDK开发,使用RSA加密和后台进行数据交互,后台是PHP 要求: 1.post请求,客户端放公钥,私钥放后台 2.发送数据:客户端的json数据-> ...
- RSA加密解密及数字签名Java实现--转
RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院 ...
- RSA加密解密算法的java实现
最近有一个外部合作项目要求在数据传输过程中使用RSA加密算法对数据进行加密,所以需要编写一个加解密的工具类,因为对方不是java语言,所以是各自实现的这个工具,本文主要讨论实现以及双方调试过程中的一些 ...
- C# Java间进行RSA加密解密交互(二)
接着前面一篇文章C# Java间进行RSA加密解密交互,继续探讨这个问题. 在前面,虽然已经实现了C# Java间进行RSA加密解密交互,但是还是与项目中要求的有所出入.在项目中,客户端(Java)的 ...
- java与.net平台之间进行RSA加密验证
RSA加密算法虽然不分平台,标准都是一样的,但是各个平台的实现方式都不尽相同,下面来我来说说 java与.net平台之间该如何进行RSA加密验证, 即java端加密->.net端验证和.net端 ...
- RSA加密解密(附源码工程)
一.RSA加密介绍 RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987 ...
- token加密——RSA加密
RSA加密工具类 RsaUtils.java package com.hahashujia.utils;import lombok.extern.slf4j.Slf4j; import org.apa ...
- iOS使用Security.framework进行RSA 加密解密签名和验证签名
iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...
- ios rsa java_一篇搞定RSA加密与SHA签名|与Java完全同步
本文是投稿文章,作者:Panda_iOS 看到这篇文章的同学可幸福了,当时在做RSA加密与签名的时候网上的资料简直不要太老,做完后实在是忍受不下去了,这篇文章我会详细讲解iOS如何实现RSA加密与签名 ...
最新文章
- php 爬虫_Scrapy 爬虫完整案例-基础篇
- python3创建定时任务
- 浅淡HTML5移动Web开发
- asp.net 返回超时的解决方法
- node nest 框架学习(一)
- CMD-NET命令详解、NET命令大全(转)
- java远程调用linux的命令或者脚本
- nssl1195-健美猫【???】
- swift for循环_Swift | 实战一个简单的素数计算器demo
- 通过 JavaScript 获取/设置元素样式的方法
- redis13---事务处理。
- android edittext drawable,android – 在事件上显示复合drawable到EditText
- php代码连接mysql数据库,php连接mysql数据库代码
- Atitit.创建快捷方式 windows快捷方式的原理
- 高等数学(第七版)同济大学 习题3-5 个人解答
- EPSON LQ-675KT 打印机无法进纸解决方法
- 安卓微信本地数据库解密
- 基于MD5计算的未来网络游戏无限信息提取技术
- 电商公司ERP管理软件与旺店通、第三方仓库以及云仓的贯通解决方案
- php源代码压缩,代码压缩工具_PHP 源代码压缩小工具
热门文章
- select frame 什么意思?
- 交通优化需求下 智能交通已达千亿市场
- winform代码:关联窗体数据更新,删除dataGridview中选中的一行或多行
- 我使用的博客和通讯工具汇总
- Nagios监控Linux系统
- VC对话框全屏显示及相应控件位置改变(转)
- 用“组策略”修改注册表十大个经典范例
- springboot+vue前后端分离实现宿舍管理系统
- HDU 1022[Train Problem I] 栈的应用
- 构建一个LVS-DR模型的高性能集群,并实现Nginx、PHP、MySQL分离