我想使用预先生成的私钥在本地对字符串进行签名,然后在android和iOS上验证数据。我是密码技术的新手,所以我可能会错过很多事情。
我已经尝试使用java对数据进行签名,并在android上验证了数据,但是我无法使用相同的密钥在iOS上验证数据。 我拥有使用KeyPairGenerator生成的私钥和公钥,并将它们存储为Base64编码的字符串,以便一次又一次地重复使用。 我有一个Java程序来生成加密的文本。
Signature privateSignature = Signature.getInstance("NONEwithRSA");
privateSignature.initSign(privateKey);
privateSignature.update(Base64.getDecoder().decode(data));
byte[] signature = privateSignature.sign();
signed = Base64.getEncoder().encodeToString(signature);
我能够使用Signature.verify验证签名的数据 但是我无法在目标c中使用相同的公钥解密数据
+ (NSData *)decryptData:(NSData *)data withKeyRef:(SecKeyRef) keyRef{
const uint8_t *srcbuf = (const uint8_t *)[data bytes];
size_t srclen = (size_t)data.length;
size_t block_size = SecKeyGetBlockSize(keyRef) * sizeof(uint8_t);
UInt8 *outbuf = malloc(block_size);
size_t src_block_size = block_size;
NSMutableData *ret = [[NSMutableData alloc] init];
for(int idx=0; idx<srclen; idx+=src_block_size){
//NSLog(@"%d/%d block_size: %d", idx, (int)srclen, (int)block_size);
size_t data_len = srclen - idx;
if(data_len > src_block_size){
data_len = src_block_size;
}
size_t outlen = block_size;
OSStatus status = noErr;
status = SecKeyDecrypt(keyRef,
kSecPaddingNone,
srcbuf + idx,
data_len,
outbuf,
&outlen
);
if (status != 0) {
NSLog(@"SecKeyEncrypt fail. Error Code: %d", status);
ret = nil;
break;
}else{
//the actual decrypted data is in the middle, locate it!
int idxFirstZero = -1;
int idxNextZero = (int)outlen;
for ( int i = 0; i < outlen; i++ ) {
if ( outbuf[i] == 0 ) {
if ( idxFirstZero < 0 ) {
idxFirstZero = i;
} else {
idxNextZero = i;
break;
}
}
}
[ret appendBytes:&outbuf[idxFirstZero+1] length:idxNextZero-idxFirstZero-1];
}
}
free(outbuf);
CFRelease(keyRef);
return ret;
}
当我尝试解密签名数据时,我得到的是零,但是如果我在目标c本身中使用相同的私钥进行加密,而不是在目标c中使用公钥对其进行解密,那么我将获得原始数据。 我是否应该使用任何其他方法对数据进行签名,以获得跨平台的解决方案。任何帮助将不胜感激。