我正在为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之间的区别相关推荐

  1. ios php rsa,RSA 加密 iOS

    在iOS端使用RSA加密的记录 一.需求: SDK开发,使用RSA加密和后台进行数据交互,后台是PHP 要求: 1.post请求,客户端放公钥,私钥放后台 2.发送数据:客户端的json数据-> ...

  2. RSA加密解密及数字签名Java实现--转

    RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院 ...

  3. RSA加密解密算法的java实现

    最近有一个外部合作项目要求在数据传输过程中使用RSA加密算法对数据进行加密,所以需要编写一个加解密的工具类,因为对方不是java语言,所以是各自实现的这个工具,本文主要讨论实现以及双方调试过程中的一些 ...

  4. C# Java间进行RSA加密解密交互(二)

    接着前面一篇文章C# Java间进行RSA加密解密交互,继续探讨这个问题. 在前面,虽然已经实现了C# Java间进行RSA加密解密交互,但是还是与项目中要求的有所出入.在项目中,客户端(Java)的 ...

  5. java与.net平台之间进行RSA加密验证

    RSA加密算法虽然不分平台,标准都是一样的,但是各个平台的实现方式都不尽相同,下面来我来说说 java与.net平台之间该如何进行RSA加密验证, 即java端加密->.net端验证和.net端 ...

  6. RSA加密解密(附源码工程)

    一.RSA加密介绍 RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987 ...

  7. token加密——RSA加密

    RSA加密工具类 RsaUtils.java package com.hahashujia.utils;import lombok.extern.slf4j.Slf4j; import org.apa ...

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

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

  9. ios rsa java_一篇搞定RSA加密与SHA签名|与Java完全同步

    本文是投稿文章,作者:Panda_iOS 看到这篇文章的同学可幸福了,当时在做RSA加密与签名的时候网上的资料简直不要太老,做完后实在是忍受不下去了,这篇文章我会详细讲解iOS如何实现RSA加密与签名 ...

最新文章

  1. php 爬虫_Scrapy 爬虫完整案例-基础篇
  2. python3创建定时任务
  3. 浅淡HTML5移动Web开发
  4. asp.net 返回超时的解决方法
  5. node nest 框架学习(一)
  6. CMD-NET命令详解、NET命令大全(转)
  7. java远程调用linux的命令或者脚本
  8. nssl1195-健美猫【???】
  9. swift for循环_Swift | 实战一个简单的素数计算器demo
  10. 通过 JavaScript 获取/设置元素样式的方法
  11. redis13---事务处理。
  12. android edittext drawable,android – 在事件上显示复合drawable到EditText
  13. php代码连接mysql数据库,php连接mysql数据库代码
  14. Atitit.创建快捷方式 windows快捷方式的原理
  15. 高等数学(第七版)同济大学 习题3-5 个人解答
  16. EPSON LQ-675KT 打印机无法进纸解决方法
  17. 安卓微信本地数据库解密
  18. 基于MD5计算的未来网络游戏无限信息提取技术
  19. 电商公司ERP管理软件与旺店通、第三方仓库以及云仓的贯通解决方案
  20. php源代码压缩,代码压缩工具_PHP 源代码压缩小工具

热门文章

  1. select frame 什么意思?
  2. 交通优化需求下 智能交通已达千亿市场
  3. winform代码:关联窗体数据更新,删除dataGridview中选中的一行或多行
  4. 我使用的博客和通讯工具汇总
  5. Nagios监控Linux系统
  6. VC对话框全屏显示及相应控件位置改变(转)
  7. 用“组策略”修改注册表十大个经典范例
  8. springboot+vue前后端分离实现宿舍管理系统
  9. HDU 1022[Train Problem I] 栈的应用
  10. 构建一个LVS-DR模型的高性能集群,并实现Nginx、PHP、MySQL分离