ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/Crypt-Spritz/Spritz.pm
(Generate patch)

Comparing cvsroot/Crypt-Spritz/Spritz.pm (file contents):
Revision 1.4 by root, Sat Jan 10 07:10:46 2015 UTC vs.
Revision 1.14 by root, Sun Mar 5 16:33:55 2017 UTC

1=head1 NAME 1=head1 NAME
2 2
3Crypt::Spritz - Crypt::CBC compliant Spritz encryption/hash/mac/aead/prng module 3Crypt::Spritz - Spritz stream cipher/hash/MAC/AEAD/CSPRNG family
4 4
5=head1 SYNOPSIS 5=head1 SYNOPSIS
6 6
7 use Crypt::Spritz; 7 use Crypt::Spritz;
8 8
9 # keysize() is 32, but spritz accepts any key size 9 # see the commented examples in their respective classes,
10 # blocksize() is 16, but cna be anything 10 # but basically
11 11
12 $cipher = new Crypt::Twofish2 "a" x 32, Crypt::Twofish2::MODE_CBC; 12 my $cipher = new Crypt::Spritz::Cipher::XOR $key, $iv;
13 $ciphertext = $cipher->crypt ($cleartext);
13 14
15 my $cipher = new Crypt::Spritz::Cipher $key, $iv;
14 $crypted = $cipher->encrypt($plaintext); 16 $ciphertext = $cipher->encrypt ($cleartext);
15 # - OR -
16 $plaintext = $cipher->decrypt($crypted); 17 # $cleartext = $cipher->decrypt ($ciphertext);
18
19 my $hasher = new Crypt::Spritz::Hash;
20 $hasher->add ($data);
21 $digest = $hasher->finish;
22
23 my $hasher = new Crypt::Spritz::MAC $key;
24 $hasher->add ($data);
25 $mac = $hasher->finish;
26
27 my $prng = new Crypt::Spritz::PRNG $entropy;
28 $prng->add ($additional_entropy);
29 $keydata = $prng->get (32);
30
31 my $aead = new Crypt::Spritz::AEAD::XOR $key;
32 $aead->nonce ($counter);
33 $aead->associated_data ($header);
34 $ciphertext = $aead->crypt ($cleartext);
35 $mac = $aead->mac;
36
37 my $aead = new Crypt::Spritz::AEAD $key;
38 $aead->nonce ($counter);
39 $aead->associated_data ($header);
40 $ciphertext = $aead->encrypt ($cleartext);
41 # $cleartext = $aead->decrypt ($ciphertext);
42 $mac = $aead->mac;
43
44=head1 WARNING
45
46The best known result (early 2017) against Spritz is a distinguisher
47attack on 2**44 outputs with multiple keys/IVs, and on 2**60 outputs with
48a single key (see doi:10.1007/978-3-662-52993-5_4 for details). These are
49realistic attacks, so Spritz needs to be considered broken, although for
50low data applications it should still be useful.
17 51
18=head1 DESCRIPTION 52=head1 DESCRIPTION
19 53
20This module implements the Spritz spongelike function (with N=256), the 54This module implements the Spritz spongelike function (with N=256), the
21spiritual successor of RC4 developed by Ron Rivest and Jacob Schuldt. 55spiritual successor of RC4 developed by Ron Rivest and Jacob Schuldt.
31slower than RC4 or AES, hashing many times slower than SHA-3, although 65slower than RC4 or AES, hashing many times slower than SHA-3, although
32this might be reversed on an 8-bit-cpu) and the fact that it is totally 66this might be reversed on an 8-bit-cpu) and the fact that it is totally
33unproven in the field (as of this writing, the cipher was just a few 67unproven in the field (as of this writing, the cipher was just a few
34months old), so it can't be called production-ready. 68months old), so it can't be called production-ready.
35 69
36All the usual caveats regarding stream ciphers apply - never repeat 70All the usual caveats regarding stream ciphers apply - never repeat your
37your key, never repeat your nonce etc. - you should have some basic 71key, never repeat your nonce and so on - you should have some basic
38understanding of cryptography before using this cipher in your own 72understanding of cryptography before using this cipher in your own
39designs. 73designs.
40 74
41The Spritz base class is not meant for end users. To make usage simpler 75The Spritz base class is not meant for end users. To make usage simpler
42and safer, a number of convenience classes are provided for typical 76and safer, a number of convenience classes are provided for typical
43end-user tasks: 77end-user tasks:
44 78
45 encryption - Crypt::Spritz::Cipher::XOR 79 random number generation - Crypt::Spritz::PRNG
46 hashing - Crypt::Spritz::Hash 80 hashing - Crypt::Spritz::Hash
47 message authentication - Crypt::Spritz::MAC 81 message authentication - Crypt::Spritz::MAC
82 encryption - Crypt::Spritz::Cipher::XOR
83 encryption - Crypt::Spritz::Cipher
48 authenticated encryption - Crypt::Spritz::AEAD::XOR 84 authenticated encryption - Crypt::Spritz::AEAD::XOR
49 random number generation - Crypt::Spritz::PRNG 85 authenticated encryption - Crypt::Spritz::AEAD
50 86
51=cut 87=cut
52 88
53package Crypt::Spritz; 89package Crypt::Spritz;
54 90
55use XSLoader; 91use XSLoader;
56 92
57$VERSION = '0.0'; 93$VERSION = 1.02;
58 94
59XSLoader::load __PACKAGE__, $VERSION; 95XSLoader::load __PACKAGE__, $VERSION;
60 96
61@Crypt::Spritz::ISA = Crypt::Spritz::Base::; 97@Crypt::Spritz::ISA = Crypt::Spritz::Base::;
62 98
89 125
90=head2 THE Crypt::Spritz CLASS 126=head2 THE Crypt::Spritz CLASS
91 127
92This class implements most of the Spritz primitives. To use it effectively 128This class implements most of the Spritz primitives. To use it effectively
93you should understand them, for example, by reading the L<Spritz 129you should understand them, for example, by reading the L<Spritz
94paper/http://people.csail.mit.edu/rivest/pubs/RS14.pdf>, especially 130paper|http://people.csail.mit.edu/rivest/pubs/RS14.pdf>, especially
95pp. 5-6. 131pp. 5-6.
96 132
97The Spritz primitive corresponding to the Perl method is given as 133The Spritz primitive corresponding to the Perl method is given as
98comment. 134comment.
99 135
105 141
106=item $spritz->init # InitializeState 142=item $spritz->init # InitializeState
107 143
108Initialises the Spritz state again, throwing away the previous state. 144Initialises the Spritz state again, throwing away the previous state.
109 145
146=item $another_spritz = $spritz->clone
147
148Make an exact copy of the spritz state. This method can be called on all
149of the objects in this module, but is documented separately to give some
150cool usage examples.
151
110=item $spritz->update # Update 152=item $spritz->update # Update
111 153
112=item $spritz->whip ($r) # Whip 154=item $spritz->whip ($r) # Whip
113 155
114=item $spritz->crush # Crush 156=item $spritz->crush # Crush
120Calls the Spritz primitive ovf the same name - these are not normally 162Calls the Spritz primitive ovf the same name - these are not normally
121called manually. 163called manually.
122 164
123=item $spritz->absorb ($I) # Absorb 165=item $spritz->absorb ($I) # Absorb
124 166
125Absorbs the given data into the state (usually used for key material, nonces, IVs 167Absorbs the given data into the state (usually used for key material,
126messages to be hashed and so on). 168nonces, IVs messages to be hashed and so on).
127 169
128=item $spritz->absorb_stop # AbsorbStop 170=item $spritz->absorb_stop # AbsorbStop
129 171
130Absorbs a special stop symbol - this is usually used as delimiter between 172Absorbs a special stop symbol - this is usually used as delimiter between
131multiple strings to be absorbed, to thwart extension attacks. 173multiple strings to be absorbed, to thwart extension attacks.
140Squeezes out a single byte from the state. 182Squeezes out a single byte from the state.
141 183
142=item $octets = $spritz->squeeze ($len) # Squeeze 184=item $octets = $spritz->squeeze ($len) # Squeeze
143 185
144Squeezes out the requested number of bytes from the state - this is usually 186Squeezes out the requested number of bytes from the state - this is usually
187
188=back
189
190
191=head2 THE Crypt::Spritz::PRNG CLASS
192
193This class implements a Pseudorandom Number Generatore (B<PRNG>),
194sometimes also called a Deterministic Random Bit Generator (B<DRBG>). In
195fact, it is even cryptographically secure, making it a B<CSPRNG>.
196
197Typical usage as a random number generator involves creating a PRNG
198object with a seed of your choice, and then fetching randomness via
199C<get>:
200
201 # create a PRNG object, use a seed string of your choice
202 my $prng = new Crypt::Spritz::PRNG $seed;
203
204 # now call get as many times as you wish to get binary randomness
205 my $some_randomness = $prng->get (17);
206 my moree_randomness = $prng->get (5000);
207 ...
208
209Typical usage as a cryptographically secure random number generator is to
210feed in some secret entropy (32 octets/256 bits are commonly considered
211enough), for example from C</dev/random> or C</dev/urandom>, and then
212generate some key material.
213
214 # create a PRNG object
215 my $prng = new Crypt::Spritz::PRNG;
216
217 # seed some entropy (either via ->add or in the constructor)
218 $prng->add ($some_secret_highly_entropic_string);
219
220 # now call get as many times as you wish to get
221 # hard to guess binary randomness
222 my $key1 = $prng->get (32);
223 my $key2 = $prng->get (16);
224 ...
225
226 # for long running programs, it is advisable to
227 # reseed the PRNG from time to time with new entropy
228 $prng->add ($some_more_entropy);
229
230=over 4
231
232=item $prng = new Crypt::Spritz::PRNG [$seed]
233
234Creates a new random number generator object. If C<$seed> is given, then
235the C<$seed> is added to the internal state as if by a call to C<add>.
236
237=item $prng->add ($entropy)
238
239Adds entropy to the internal state, thereby hopefully making it harder
240to guess. Good sources for entropy are irregular hardware events, or
241randomness provided by C</dev/urandom> or C</dev/random>.
242
243The design of the Spritz PRNG should make it strong against attacks where
244the attacker controls all the entropy, so it should be safe to add entropy
245from untrusted sources - more is better than less if you need a CSPRNG.
246
247For use as PRNG, of course, this matters very little.
248
249=item $octets = $prng->get ($length)
250
251Generates and returns C<$length> random octets as a string.
252
253=back
254
255
256=head2 THE Crypt::Spritz::Hash CLASS
257
258This implements the Spritz digest/hash algorithm. It works very similar to
259other digest modules on CPAN, such as L<Digest::SHA3>.
260
261Typical use for hashing:
262
263 # create hasher object
264 my $hasher = new Crypt::Spritz::Hash;
265
266 # now feed data to be hashed into $hasher
267 # in as few or many calls as required
268 $hasher->add ("Some data");
269 $hasher->add ("Some more");
270
271 # extract the hash - the object is not usable afterwards
272 my $digest = $hasher->finish (32);
273
274=over 4
275
276=item $hasher = new Crypt::Spritz::Hash
277
278Creates a new hasher object.
279
280=item $hasher->add ($data)
281
282Adds data to be hashed into the hasher state. It doesn't matter whether
283you pass your data in in one go or split it up, the hash will be the same.
284
285=item $digest = $hasher->finish ($length)
286
287Calculates a hash digest of the given length and return it. The object
288cannot sensibly be used for further hashing afterwards.
289
290Typical digest lengths are 16 and 32, corresponding to 128 and 256 bit
291digests, respectively.
292
293=item $another_hasher = $hasher->clone
294
295Make an exact copy of the hasher state. This can be useful to generate
296incremental hashes, for example.
297
298Example: generate a hash for the data already fed into the hasher, by keeping
299the original hasher for further C<add> calls and calling C<finish> on a C<clone>.
300
301 my $intermediate_hash = $hasher->clone->finish;
302
303Example: hash 64KiB of data, and generate a hash after every kilobyte that
304is over the full data.
305
306 my $hasher = new Crypt::Spritz::Hash;
307
308 for (0..63) {
309 my $kib = "x" x 1024; # whatever data
310
311 $hasher->add ($kib);
312
313 my $intermediate_hash = $hasher->clone->finish;
314 ...
315 }
316
317These kind of intermediate hashes are sometimes used in communications
318protocols to protect the integrity of the data incrementally, e.g. to
319detect errors early, while still having a complete hash at the end of a
320transfer.
321
322=back
323
324
325=head2 THE Crypt::Spritz::MAC CLASS
326
327This implements the Spritz Message Authentication Code algorithm. It works
328very similar to other digest modules on CPAN, such as L<Digest::SHA3>, but
329implements an authenticated digest (like L<Digest::HMAC>).
330
331I<Authenticated> means that, unlike L<Crypt::Spritz::Hash>, where
332everybody can verify and recreate the hash value for some data, with a
333MAC, knowledge of the (hopefully) secret key is required both to create
334and to verify the digest.
335
336Typical use for hashing is almost the same as with L<Crypt::Spritz::MAC>,
337except a key (typically 16 or 32 octets) is provided to the constructor:
338
339 # create hasher object
340 my $hasher = new Crypt::Spritz::Mac $key;
341
342 # now feed data to be hashed into $hasher
343 # in as few or many calls as required
344 $hasher->add ("Some data");
345 $hasher->add ("Some more");
346
347 # extract the mac - the object is not usable afterwards
348 my $mac = $hasher->finish (32);
349
350=over 4
351
352=item $hasher = new Crypt::Spritz::MAC $key
353
354Creates a new hasher object. The C<$key> can be of any length, but 16 and
35532 (128 and 256 bit) are customary.
356
357=item $hasher->add ($data)
358
359Adds data to be hashed into the hasher state. It doesn't matter whether
360you pass your data in in one go or split it up, the hash will be the same.
361
362=item $mac = $hasher->finish ($length)
363
364Calculates a message code of the given length and return it. The object
365cannot sensibly be used for further hashing afterwards.
366
367Typical digest lengths are 16 and 32, corresponding to 128 and 256 bit
368digests, respectively.
369
370=item $another_hasher = $hasher->clone
371
372Make an exact copy of the hasher state. This can be useful to
373generate incremental macs, for example.
374
375See the description for the C<Crypt::Spritz::Hash::clone> method for some
376examples.
145 377
146=back 378=back
147 379
148 380
149=head2 THE Crypt::Spritz::Cipher::XOR CLASS 381=head2 THE Crypt::Spritz::Cipher::XOR CLASS
192 424
193=item $encrypted = $cipher->crypt ($cleartext) 425=item $encrypted = $cipher->crypt ($cleartext)
194 426
195=item $cleartext = $cipher->crypt ($encrypted) 427=item $cleartext = $cipher->crypt ($encrypted)
196 428
197Encrypt or decrypt a piece of a message. This cna be called as many times 429Encrypt or decrypt a piece of a message. This can be called as many times
198as you want, and the message can be split into as few or many pieces as 430as you want, and the message can be split into as few or many pieces as
199required without affecting the results. 431required without affecting the results.
200 432
201=item $cipher->crypt_inplace ($cleartext_or_ciphertext) 433=item $cipher->crypt_inplace ($cleartext_or_ciphertext)
202 434
203Same as C<crypt>, except it I<modifies the argument in-place>. 435Same as C<crypt>, except it I<modifies the argument in-place>.
204 436
437=item $another_cipher = $cipher->clone
438
439Make an exact copy of the cipher state. This can be useful to cache states
440for reuse later, for example, to avoid expensive key setups.
441
442While there might be use cases for this feature, it makes a lot more sense
443for C<Crypt::Spritz::AEAD> and C<Crypt::Spritz::AEAD::XOR>, as they allow
444you to specify the IV/nonce separately.
445
205=item $constant_32 = $cipher->keysize 446=item $constant_32 = $cipher->keysize
206 447
207=item $constant_64 = $cipher->blocksize 448=item $constant_64 = $cipher->blocksize
208 449
209These methods are provided for L<Crypt::CBC> compatibility and simply 450These methods are provided for L<Crypt::CBC> compatibility and simply
213not a block cipher and already provides an appropriate mode. 454not a block cipher and already provides an appropriate mode.
214 455
215=back 456=back
216 457
217 458
218=head2 THE Crypt::Spritz::Hash CLASS 459=head2 THE Crypt::Spritz::Cipher CLASS
219 460
220This implements the Spritz digest/hash algorithm. It works very similar to 461This class is pretty much the same as the C<Crypt::Spritz::Cipher::XOR>
221other digest modules on CPAN, such as L<Digest::SHA3>. 462class, with two differences: first, it implements the "standard" Spritz
463encryption algorithm, and second, while this variant is easier to analyze
464mathematically, there is little else to recommend it for, as it is slower,
465and requires lots of code duplication code.
222 466
223Typical use for hashing: 467So unless you need to be compatible with another implementation that does
468not offer the XOR variant, stick to C<Crypt::Spritz::Cipher::XOR>.
224 469
225 # create hasher object 470All the methods from C<Crypt::Spritz::Cipher::XOR> are available, except
226 my $hasher = new Crypt::Spritz::Hash; 471C<crypt>, which has been replaced by separate C<encrypt> and C<decrypt>
227 472methods:
228 # now feed data to be hashed into $hasher
229 # in as few or many calls as required
230 $hasher->add ("Some data");
231 $hasher->add ("Some more");
232
233 # extract the hash - the object is not usable afterwards
234 my $digest = $hasher->finish (32);
235 473
236=over 4 474=over 4
237 475
238=item $hasher = new Crypt::Spritz::Hash 476=item $encrypted = $cipher->encrypt ($cleartext)
239 477
240Creates a new hasher object. 478=item $cleartext = $cipher->decrypt ($encrypted)
241 479
242=item $hasher->add ($data) 480Really the same as C<Crypt::Spritz::Cipher::XOR>, except you need separate
243 481calls and code for encryption and decryption.
244Adds data to be hashed into the hasher state. It doesn't matter whether
245you pass your data in in one go or split it up, the hash will be the same.
246
247=item $digest = $hasher->finish ($length)
248
249Calculates a hash digest of the given length and return it. The object
250cannot sensibly be used for further hashing afterwards.
251
252Typical digest lengths are 16 and 32, corresponding to 128 and 256 bit
253digests, respectively.
254
255=back
256
257
258=head2 THE Crypt::Spritz::MAC CLASS
259
260This implements the Spritz Message Authentication Code algorithm. It works
261very similar to other digest modules on CPAN, such as L<Digest::SHA3>, but
262implements an authenticated digest (like L<Digest::HMAC>).
263
264I<Authenticated> means that, unlike L<Crypt::Spritz::Hash>, where
265everybody can verify and recreate the hash value for some data, with a
266MAC, knowledge of the (hopefully) secret key is required both to create
267and to verify the digest.
268
269Typical use for hashing is almost the same as with L<Crypt::Spritz::MAC>,
270except a key (typically 16 or 32 octets) is provided to the constructor:
271
272 # create hasher object
273 my $hasher = new Crypt::Spritz::Mac $key;
274
275 # now feed data to be hashed into $hasher
276 # in as few or many calls as required
277 $hasher->add ("Some data");
278 $hasher->add ("Some more");
279
280 # extract the mac - the object is not usable afterwards
281 my $mac = $hasher->finish (32);
282
283=over 4
284
285=item $hasher = new Crypt::Spritz::MAC $key
286
287Creates a new hasher object. The C<$key> can be of any length, but 16 and
28832 (128 and 256 bit) are customary.
289
290=item $hasher->add ($data)
291
292Adds data to be hashed into the hasher state. It doesn't matter whether
293you pass your data in in one go or split it up, the hash will be the same.
294
295=item $mac = $hasher->finish ($length)
296
297Calculates a message code of the given length and return it. The object
298cannot sensibly be used for further hashing afterwards.
299
300Typical digest lengths are 16 and 32, corresponding to 128 and 256 bit
301digests, respectively.
302 482
303=back 483=back
304 484
305 485
306=head2 THE Crypt::Spritz::AEAD::XOR CLASS 486=head2 THE Crypt::Spritz::AEAD::XOR CLASS
385increments, and thus reuse the same sequence number. The problem with 565increments, and thus reuse the same sequence number. The problem with
386random strings i that your random number generator might be hosed and 566random strings i that your random number generator might be hosed and
387generate the same randomness multiple times (randomness can be very hard 567generate the same randomness multiple times (randomness can be very hard
388to get especially on embedded devices). 568to get especially on embedded devices).
389 569
390=item $aead->associated_data ($data)( 570=item $aead->associated_data ($data)
391 571
392Provide the associated data (cleartext data to be authenticated but not 572Provide the associated data (cleartext data to be authenticated but not
393encrypted). This method I<must> be called I<after> C<nonce> and I<before> 573encrypted). This method I<must> be called I<after> C<nonce> and I<before>
394C<crypt>. 574C<crypt>.
395 575
404 584
405=item $encrypted = $cipher->crypt ($cleartext) 585=item $encrypted = $cipher->crypt ($cleartext)
406 586
407=item $cleartext = $cipher->crypt ($encrypted) 587=item $cleartext = $cipher->crypt ($encrypted)
408 588
409Encrypt or decrypt a piece of a message. This cna be called as many times 589Encrypt or decrypt a piece of a message. This can be called as many times
410as you want, and the message can be split into as few or many pieces as 590as you want, and the message can be split into as few or many pieces as
411required without affecting the results, with one exception: All except the 591required without affecting the results, with one exception: All except the
412last call to C<crypt> needs to pass in a multiple of C<64> octets. The 592last call to C<crypt> needs to pass in a multiple of C<64> octets. The
413last call to C<crypt> does not have this limitation. 593last call to C<crypt> does not have this limitation.
414 594
415=item $cipher->crypt_inplace ($cleartext_or_ciphertext) 595=item $cipher->crypt_inplace ($cleartext_or_ciphertext)
416 596
417Same as C<crypt>, except it I<modifies the argument in-place>. 597Same as C<crypt>, except it I<modifies the argument in-place>.
418 598
599=item $another_cipher = $cipher->clone
600
601Make an exact copy of the cipher state. This can be useful to cache states
602for reuse later, for example, to avoid expensive key setups.
603
604Example: set up a cipher state with a key, then clone and use it to
605encrypt messages with different nonces.
606
607 my $cipher = new Crypt::Spritz::AEAD::XOR $key;
608
609 my $message_counter;
610
611 for my $message ("a", "b", "c") {
612 my $clone = $cipher->clone;
613 $clone->nonce (pack "N", ++$message_counter);
614 $clone->associated_data ("");
615 my $encrypted = $clone->crypt ($message);
616 ...
617 }
618
419=back 619=back
420 620
421 621
422=head2 THE Crypt::Spritz::PRNG CLASS 622=head2 THE Crypt::Spritz::AEAD CLASS
423 623
424This class implements a Pseudorandom Number Generatore (B<PRNG>), 624This class is pretty much the same as the C<Crypt::Spritz::AEAD::XOR>
425sometimes also called a Deterministic Random Bit Generator (B<DRBG>). In 625class, with two differences: first, it implements the "standard" Spritz
426fact, it is even cryptographically secure, making it a B<CSPRNG>. 626encryption algorithm, and second, while this variant is easier to analyze
627mathematically, there is little else to recommend it for, as it is slower,
628and requires lots of code duplication code.
427 629
428Typical usage as a random number generator involves creating a PRNG 630So unless you need to be compatible with another implementation that does
429object with a seed of your choice, and then fetching randomness via 631not offer the XOR variant, stick to C<Crypt::Spritz::AEAD::XOR>.
430C<get>:
431 632
432 # create a PRNG object, use a seed string of your choice 633All the methods from C<Crypt::Spritz::AEAD::XOR> are available, except
433 my $prng = new Crypt::Spritz::PRNG $seed; 634C<crypt>, which has been replaced by separate C<encrypt> and C<decrypt>
434 635methods:
435 # now call get as many times as you wish to get binary randomness
436 my $some_randomness = $prng->get (17);
437 my moree_randomness = $prng->get (5000);
438 ...
439
440Typical usage as a cryptographically secure random number generator is to
441feed in some secret entropy (32 octets/256 bits are commonly considered
442enough), for example from C</dev/random> or C</dev/urandom>, and then
443generate some key material.
444
445 # create a PRNG object
446 my $prng = new Crypt::Spritz::PRNG;
447
448 # seed some entropy (either via ->add or in the constructor)
449 $prng->add ($some_secret_highly_entropic_string);
450
451 # now call get as many times as you wish to get
452 # hard to guess binary randomness
453 my $key1 = $prng->get (32);
454 my $key2 = $prng->get (16);
455 ...
456
457 # for long running programs, it is advisable to
458 # reseed the PRNG from time to time with new entropy
459 $prng->add ($some_more_entropy);
460 636
461=over 4 637=over 4
462 638
463=item $prng = new Crypt::Spritz::PRNG [$seed] 639=item $encrypted = $cipher->encrypt ($cleartext)
464 640
465Creates a new random number generator object. If C<$seed> is given, then 641=item $cleartext = $cipher->decrypt ($encrypted)
466the C<$seed> is added to the internal state as if by a call to C<add>.
467 642
468=item $prng->add ($entropy) 643Really the same as C<Crypt::Spritz::AEAD::XOR>, except you need separate
469 644calls and code for encryption and decryption, but you have the same
470Adds entropy to the internal state, thereby hopefully making it harder 645limitations on usage.
471to guess. Good sources for entropy are irregular hardware events, or
472randomness provided by C</dev/urandom> or C</dev/random>.
473
474The design of the Spritz PRNG should make it strong against attacks where
475the attacker controls all the entropy, so it should be safe to add entropy
476from untrusted sources - more is better than less if you need a CSPRNG.
477
478For use as PRNG, of course, this matters very little.
479
480=item $octets = $prng->get ($length)
481
482Generates and returns C<$length> random octets as a string.
483 646
484=back 647=back
648
649
650=head1 SECURITY CONSIDERATIONS
651
652At the time of this writing, Spritz has not been through a lot of
653cryptanalysis - it might get broken tomorrow. That's true for any crypto
654algo, but the probability is quite a bit higher with Spritz. Having said
655that, Spritz is almost certainly safer than RC4 at this time.
656
657Nevertheless, I wouldn't protect something very expensive with it. I also
658would be careful about timing attacks.
659
660Regarding key lengths - as has been pointed out, traditional symmetric key
661lengths (128 bit, 256 bit) work fine. Longer keys will be overkill, but
662you can expect keys up to about a kilobit to be effective. Longer keys are
663safe to use, they will simply be a waste of time.
664
665
666=head1 PERFORMANCE
667
668As a cipher/prng, Spritz is reasonably fast (about 100MB/s on 2014 era
669hardware, for comparison, AES will be more like 200MB/s).
670
671For key setup, ivs, hashing, nonces and so on, Spritz is very slow (about
6725MB/s on 2014 era hardware, which does SHA-256 at about 200MB/s).
673
674
675=head1 SUPPORT FOR THE PERL MULTICORE SPECIFICATION
676
677This module supports the perl multicore specification
678(L<http://perlmulticore.schmorp.de/>) for all encryption/decryption
679(non-aead > 4000 octets, aead > 400 octets), hashing/absorbing (> 400
680octets) and squeezing/prng (> 4000 octets) functions.
485 681
486 682
487=head1 SEE ALSO 683=head1 SEE ALSO
488 684
489L<http://people.csail.mit.edu/rivest/pubs/RS14.pdf>. 685L<http://people.csail.mit.edu/rivest/pubs/RS14.pdf>.
495completely unproven. 691completely unproven.
496 692
497=head1 AUTHOR 693=head1 AUTHOR
498 694
499 Marc Lehmann <schmorp@schmorp.de> 695 Marc Lehmann <schmorp@schmorp.de>
500 http://home.schmorp.de/ 696 http://software.schmorp.de/pkg/Crypt-Spritz
501 697
502=cut 698=cut
503 699
5041; 7001;
505 701

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines