Подписывайте данные с помощью закрытого ключа RSA локально, а затем проверяйте, что данные в iOS и Android с помощью открытого ключа - PullRequest
0 голосов
/ 05 июня 2019

Я хочу подписать строку локально, используя предварительно сгенерированный закрытый ключ, а затем проверить данные на 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, используя открытый ключ, я получаю исходные данныеназад.Должен ли я использовать любой другой метод для подписи данных, чтобы получить кросс-платформенное решение.любая помощь будет оценена.

...