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