2011-09-24 14 views
6

Necesito generar algunos datos aleatorios para anexar a mi archivo para el cifrado. ¿Cómo voy a hacer esto? ¿Sería una especie de la misma idea que generar una cadena de caracteres aleatorios?¿Generar bytes aleatorios Cocoa?

Algo así como:

NSData *randomData = @"what should i put here?"; 

Y a continuación, utilizar la función rand() para aleatorizar los datos?

Su ayuda es muy apreciada

+0

¿Cómo sabrá qué bytes son la adición aleatoria y cuáles son parte del texto plano original cuando descifra? Ya existen varios esquemas de relleno criptográfico diferentes para su uso en diferentes circunstancias, la mayoría de los cuales son más fáciles de cortar después que un grupo de bytes aleatorios. – rossum

Respuesta

14

int SecRandomCopyBytes ( SecRandomRef rnd, size_t count, uint8_t *bytes );

Por ejemplo:

uint8_t data[100]; 
int err = 0; 

// Don't ask for too many bytes in one go, that can lock up your system 
err = SecRandomCopyBytes(kSecRandomDefault, 100, data); 
if(err != noErr) 
    @throw [NSException exceptionWithName:@"..." reason:@"..." userInfo:nil]; 

NSData* randomData = [[NSData alloc] initWithBytes:data length:100]; 

Como ha señalado Peter en los comentarios, también se puede hacer esto:

NSMutableData* data = [NSMutableData dataWithLength:100]; 
err = SecRandomCopyBytes(kSecRandomDefault, 100, [data mutableBytes]); 

Y como señaló Rob en los comentarios, debe vincular Security.framework para Sec. RandomCopyBytes estará disponible. También debe incluir SecRandom.h.

+0

¿Esto funcionaría para el cacao? –

+0

Sí; puede usar [NSData initWithBytes: length:] para obtener los datos en un objeto NSData. – James

+0

Esto no funcionó para mí ... –

1

En UNIX puede confiar en/dev/random o/dev/urandom para obtener aleatoriedad de calidad criptográfica.

NSData *bytes = [[NSFileHandle fileHandleForReadingAtPath: @"/dev/random"] readDataOfLength: 100]; 

Como parece, lee 100 bytes de/dev/random. Consulte man urandom para más detalles.

Cuestiones relacionadas