CryptoExcercise Проблема шифрования / дешифрования - PullRequest
2 голосов
/ 13 мая 2010

Я использую яблоки "cryptoexcercise" (Security.Framework) в своем приложении для шифрования и дешифрования данных числового значения. Когда я даю ввод 950,128, значения были зашифрованы, но они не расшифровываются и существуют только с зашифрованным значением. Это происходит только с указанными числовыми значениями. Не могли бы вы проверить эту проблему и дать решение, чтобы решить эту проблему?

вот мой код

  (void)testAsymmetricEncryptionAndDecryption {
  uint8_t *plainBuffer; uint8_t *cipherBuffer; uint8_t *decryptedBuffer;

  const char inputString[] = "950"; int len = strlen(inputString);

  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);

  NSLog(@"plain text : %s", plainBuffer);

  [self encryptWithPublicKey:(UInt8 *)plainBuffer cipherBuffer:cipherBuffer];

  NSLog(@"encrypted data: %s", cipherBuffer);

  [self decryptWithPrivateKey:cipherBuffer plainBuffer:decryptedBuffer];

  NSLog(@"decrypted data: %s", decryptedBuffer);

  free(plainBuffer); free(cipherBuffer); free(decryptedBuffer); }


  (void)encryptWithPublicKey:(uint8_t *)plainBuffer cipherBuffer:(uint8_t *)cipherBuffer {
  OSStatus status = noErr;

  size_t plainBufferSize = strlen((char *)plainBuffer); size_t cipherBufferSize = CIPHER_BUFFER_SIZE;

  NSLog(@"SecKeyGetBlockSize() public = %d", SecKeyGetBlockSize([self getPublicKeyRef])); // Error handling // Encrypt using the public. status = SecKeyEncrypt([self getPublicKeyRef], PADDING, plainBuffer, plainBufferSize, &cipherBuffer[0], &cipherBufferSize ); NSLog(@"encryption result code: %d (size: %d)", status, cipherBufferSize); NSLog(@"encrypted text: %s", cipherBuffer); }


  (void)decryptWithPrivateKey:(uint8_t *)cipherBuffer plainBuffer:(uint8_t *)plainBuffer { OSStatus status = noErr;

  size_t cipherBufferSize = strlen((char *)cipherBuffer);

  NSLog(@"decryptWithPrivateKey: length of buffer: %d", BUFFER_SIZE); NSLog(@"decryptWithPrivateKey: length of input: %d", cipherBufferSize);

  // DECRYPTION size_t plainBufferSize = BUFFER_SIZE;

  // Error handling status = SecKeyDecrypt([self getPrivateKeyRef], PADDING, &cipherBuffer[0], cipherBufferSize, &plainBuffer[0], &plainBufferSize ); NSLog(@"decryption result code: %d (size: %d)", status, plainBufferSize); NSLog(@"FINAL decrypted text: %s", plainBuffer);

}

  (SecKeyRef)getPublicKeyRef { OSStatus sanityCheck = noErr; SecKeyRef publicKeyReference = NULL;

  if (publicKeyRef == NULL) { NSMutableDictionary *queryPublicKey = [[NSMutableDictionary alloc] init];

  // Set the public key query dictionary.
  [queryPublicKey setObject:(id)kSecClassKey forKey:(id)kSecClass];
  [queryPublicKey setObject:publicTag forKey:(id)kSecAttrApplicationTag];
  [queryPublicKey setObject:(id)kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType];
  [queryPublicKey setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnRef];


  // Get the key.
  sanityCheck = SecItemCopyMatching((CFDictionaryRef)queryPublicKey, (CFTypeRef *)&publicKeyReference);


  if (sanityCheck != noErr)
  {
      publicKeyReference = NULL;
  }


  [queryPublicKey release];

  } else { publicKeyReference = publicKeyRef; }

  return publicKeyReference; }


  (SecKeyRef)getPrivateKeyRef { OSStatus resultCode = noErr; SecKeyRef privateKeyReference = NULL;

  if(privateKeyRef == NULL) { NSMutableDictionary * queryPrivateKey = [[NSMutableDictionary alloc] init];

  // Set the private key query dictionary.
  [queryPrivateKey setObject:(id)kSecClassKey forKey:(id)kSecClass];
  [queryPrivateKey setObject:privateTag forKey:(id)kSecAttrApplicationTag];
  [queryPrivateKey setObject:(id)kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType];
  [queryPrivateKey setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnRef];


  // Get the key.
  resultCode = SecItemCopyMatching((CFDictionaryRef)queryPrivateKey, (CFTypeRef *)&privateKeyReference);


  NSLog(@"getPrivateKey: result code: %d", resultCode);


  if(resultCode != noErr)
  {
      privateKeyReference = NULL;
  }


  [queryPrivateKey release];

  } else { privateKeyReference = privateKeyRef; }

  return privateKeyReference; }

1 Ответ

2 голосов
/ 08 ноября 2010

Прошу прощения за поздний ответ ... но ваш пример отлично сработал для меня, кроме факта

1) для privateTag и publicTag я должен был объявить

NSData *privateTag = [NSData dataWithBytes:privateKeyIdentifier length:strlen((const char *)privateKeyIdentifier)]; 

NSData *publicTag = [NSData dataWithBytes:publicKeyIdentifier length:strlen((const char *)privateKeyIdentifier)]; 

2), а также изменение privateKey == NULL вместо privateKeyRef ==NULL в ключевом справочном условии IF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...