使用RSA私钥在本地签名数据,然后使用公钥在iOS和android中验证数据

时间:2019-06-05 09:05:53

标签: java android ios objective-c rsa

我想使用预先生成的私钥在本地对字符串进行签名,然后在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中使用公钥对其进行解密,那么我将获得原始数据。 我是否应该使用任何其他方法对数据进行签名,以获得跨平台的解决方案。任何帮助将不胜感激。

0 个答案:

没有答案