Cryptography-Digest Digest #288, Volume #12 Wed, 26 Jul 00 01:13:01 EDT
Contents:
purpose of final swap in Twofish? (Eric Smith)
Re: Playing with an 8 bit cipher. ("Trevor L. Jackson, III")
Re: Crypto jokes? (potentially OT) (Steve Meyer)
It has been documented / disclosed in the past that ... (jungle)
Re: School question for you regulars. ("Trevor L. Jackson, III")
Re: Hash function? (Boris Kazak)
Re: Solution of the 8-Puzzle Using A* Search (Long) (James Pate Williams, Jr.)
Cursory Comments on Recursion (wtshaw)
Re: It has been documented / disclosed in the past that ... ([EMAIL PROTECTED])
----------------------------------------------------------------------------
From: Eric Smith <[EMAIL PROTECTED]>
Subject: purpose of final swap in Twofish?
Date: 25 Jul 2000 21:10:54 -0700
The Twofish paper does a great job of explaining the purpose of
most of the elements of the algorithm, but I'm mystified as to
the purpose of the swap after round 16, which cancels out the
swap done in that round.
Is there any particular reason for this extra swap (or equivalently,
for eliminating the swap of the last round)?
I'm working on an implementation for the Microchip PIC16 family of
microcontrollers. An implementation for the PIC18 family would be
somewhat more efficient, but those aren't yet in widespread usage.
Thanks!
Eric
------------------------------
Date: Wed, 26 Jul 2000 00:18:47 -0400
From: "Trevor L. Jackson, III" <[EMAIL PROTECTED]>
Subject: Re: Playing with an 8 bit cipher.
Mack wrote:
> >
> >
> >This cipher can be tranformed to be :
> >
> >________________________________________________________
> >unsigned char sbox[256] = { ... as above ... };
> >unsigned char tbox[256];
> >
> >void setkey (unsigned char key[32])
> >{
> > unsigned char ch;
> > int i, j;
> > for (i = 0; i != 256; ++i) {
> > ch = i;
> > for (j = 0; j != 32; ++j) {
> > ch = sbox[ch] + key[j];
> > }
> > tbox[i] = ch;
> > }
> >}
> >
> >unsigned char convert (unsigned char ch)
> >{
> > return tbox[ch];
> >}
> >________________________________________________________
> >
> >Can you see that this cipher is nothing but a simple
> >substitution ? Even plaintext attacks are not that
> >hard to do. Just drop the idea you have to use 8 bit
> >blocks because you're low on memory. Implement
> >Twofish, it requires only 64 byte RAM and offers you
> >the full security of a modern cipher.
> >
> >
> >
>
> Yes this is equivalent. But if you don't have 256 bytes
> to play with it is not possible to simply convert it into
> a table.
>
> This takes only the memory to store the key. It does
> not require additional memory. The table can be stored
> in ROM. The counter would be a register as would the
> data byte.
>
> Even Twofish is a simple substitution given the appropriate
> size s-box (not practical but true).
>
> This is to be part of a larger function. Its use is an s-box.
>
> Additionally the block size of twofish is not
> appropriate. Blowfish would be the more logical choice.
> Lastly using 64 bytes of memory is more than is available.
> When using embeded applications with only 64 bytes of
> memory it really isn't practical to use all of it for the
> encryption.
>
> Mack
> Remove njunk123 from name to reply by e-mail
If you have MIPS to use instead of memory you could emulate the permutation
table with a smaller working set. You'd need a lookup function that, given a
single byte of input (virtual array index), would return the contents of the
shuffled table that you don't have room to store. The lookup function would
have to (laboriously) backtrack the shuffle process until it could determine
the contents of the desired slot in the table.
This can probably be implemented in only a few bytes, but would take O(N^2/2)
operations on average where each operation is a virtual byte swap driven by
the RNG controlling the shuffle. Since N is 256, this is not going to be
fast.
------------------------------
From: [EMAIL PROTECTED] (Steve Meyer)
Subject: Re: Crypto jokes? (potentially OT)
Reply-To: [EMAIL PROTECTED]
Date: 26 Jul 2000 04:30:08 GMT
Maybe I should explain what I was trying to say. I was referring
to claim made in book "The Evolution of Secrecy From Mary, Queen
of Scotts to Quantum Cryptography" by Singh, S., Double Day, New
York, 1999 and also talk shown on CSPAN TV channel. There is no
corraboration in book (no references or detailed description of
discovery steps) of claim that public key cryptography was invented
by classified crypography establishment. My attempt at making
a joke is that Feyerabend's (and Lakatos' and Kuhn's) theory of
incommensurability makes it extremely unlikely that there was
secret discovery by classified establishment (see forthcoming book
of letters between Lakatos and Feyerabend "For and Against Method").
Although, almost certainly the analogy between bank vaults
and crytography was considered. Final answer to this question
will need to wait for future when historians can study the "by then"
unclassified documents.
Other part of my intended joke refers to fact that Feyerabend was
teaching at Berkeley back in early 1970's when then undergraduate
Ralph Merkle unsuccessfully attempted to get his paper on public key
cryptography published in CACM. I believe computer science referees
claimed paper had no content, i.e. it was not even possible to conceive
of public key cryptography back then. Feyerabend gave advice to
various graduate students about how to avoid EE department
(that had just annexed Karp's (?) Computer Science) from taking credit
for other people's discoveries. There was fear of loss of credit
in UC Berkeley CS Department at the time. I think Feyerabend's
knowledge of discovery "theft"(?) problem came from Brecht.
One current example is UC Berkeley EE's claim to have "discovered"
Spice analog circuit simulation instead of Larry Nagel who wrote
program and research reports.
Finally, there was quite a bit of work in UC Berkeley Computer
Science Department on unsolvable problems for which Ph.d's were
not awarded. I think most notable was Jack Revelle's work on problem
instance for which any resolution theory proving method is exponential.
I am sure Len Adelman (A of RSA) heard Jack's talks.
Joke I was trying make is that science becomes a joke when
EE departments take over study of Computer Science.
/Steve
On 23 Jul 2000 01:45:40 GMT, David A Molnar <[EMAIL PROTECTED]> wrote:
>Douglas A. Gwyn <[EMAIL PROTECTED]> wrote:
>> Steve Meyer wrote:
>>> How about claim by BBC television producer that English spy ageny
>>> discovered public key cryptography. Probably in joke that one must
>>> attend IACR conference to appreciate.
>
>> I didn't understand your joke. Is it that you really are unaware
>> that nonsecret-key encryption had in fact been invented before RSA?
>> (However, it wasn't much exploited.)
>
>This is just a guess, but he may be referring to a talk at CRYPTO '99
>which covered (among other things) "who should REALLY get the credit
>for inventing public key cryptography?"
>
>As I recall, the proposal was to consider crypto research as proceeding
>in two "parallel universes," the classified and unclassified. In the
>classified universe, Clifford Cocks & company discovered non-secret
>encryption first and Diffie & Hellman are just a footnote. In the
>unclassified universe, Diffie & Hellman are the true progenitors (and
>Merkle, RSA, etc. are their prophets) and Cocks simply merits a footnote.
>
>The humor comes from the fact that the original suggestion touches on this
>whole controversy, which seems to be considered quite important and
>certainly can raise high emotion. No idea how it relates to Feyabend's
>argument or experience (I barely know who he is, unfortunately).
>
>Hope this doesn't get me disbarred from attending future IACR conferences.
>
>-David
>
--
Steve Meyer Phone: (415) 296-7017
Pragmatic C Software Corp. Fax: (415) 296-0946
220 Montgomery St., Suite 925 email: [EMAIL PROTECTED]
San Francisco, CA 94104
------------------------------
From: jungle <[EMAIL PROTECTED]>
Subject: It has been documented / disclosed in the past that ...
Date: Wed, 26 Jul 2000 00:25:01 -0400
it has been documented / disclosed in the past that :
======================================================
- K Mitnick case - his encrypted files has not been cracked
- Ramzi Yousef WTC bomber - it took FBI experts more than a year to decipher 2
files
QUESTION : what has been used as encryption [software, algorithm, method] ?
------------------------------
Date: Wed, 26 Jul 2000 00:31:22 -0400
From: "Trevor L. Jackson, III" <[EMAIL PROTECTED]>
Subject: Re: School question for you regulars.
Eric Lee Green wrote:
[snip review of the purpose of higher education -- with which I agree]
> PS: Do I come off as arrogant in my characterization of some of the
> twits I've encountered? If so, good. I don't have time for people
> unwilling to listen to experience. I try my best to listen thoughtfully
> and comment and contribute to my co-workers ideas, and have no patience
> with those unwilling to return the favor. It shows blatant disrespect
> and lack of professionalism, and I am long past the point where I have
> to pander to that kind of nonsense. And you know something? It's proven
> to be the best way of telling the wheat from the chaff... the good
> programmers know that they don't know everything and are always willing
> to listen and try to learn new things, while the bad ones are arrogant
> twits who know it all and who refuse to believe that anybody outside
> their heads has anything to contribute. Strange, that the people who are
> worst at their job have the highest opinion of themselves, eh?
IMHO the most important asset a CS graduate has is exposure to the breadth of
the field -- a feel for the number and size of issues that they've barely
touched upon. The home-grown "engineer" typically lacks this perspective,
which it explains their characteristic arrogance.
------------------------------
From: Boris Kazak <[EMAIL PROTECTED]>
Reply-To: [EMAIL PROTECTED]
Subject: Re: Hash function?
Date: Wed, 26 Jul 2000 04:39:02 GMT
those who know me have no need of my name wrote:
>
> <[EMAIL PROTECTED]> divulged:
> >Second, I do not have a Web site,
>
> are you really a worldnet customer? if so you can have a web site, if
> you wish -- see http://home.att.net/ for more information.
> --
> okay, have a sig then
============================
No particular reasons, just plain laziness from my part
(and I can write HTML and Javascript... it would be easy).
I hope to awaken some day. BNK
------------------------------
From: [EMAIL PROTECTED] (James Pate Williams, Jr.)
Subject: Re: Solution of the 8-Puzzle Using A* Search (Long)
Date: Wed, 26 Jul 2000 05:00:40 GMT
Warning: could be off-topic for sci.crypt.
/*
Author: James Pate Williams, Jr. (c) 2000
Solution of the 8-puzzle using A* search.
*/
#include <iostream.h>
#include <stdlib.h>
#include <time.h>
/*
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;
*/
const int BaseDepth = 2; // base depth in search tree
const int LimitDepth = 52; // limit depth in search tree
const int DepthInterval = 50; // LimitDepth - BaseDepth
const int BranchingFactor = 4; // maximum branching factor
const int MaxMoves = 100; // maximum number of A* node
expansions
class Puzzle {
private:
int g, nodesExpanded, board[3][3];
public:
Puzzle(void) {
bool found;
int digit, i, j, k, placed[9] = {0};
g = nodesExpanded = 0;
for (i = 0; i < 3; i++)
for (j = 0; j < 3; j++)
board[i][j] = 0;
for (i = 0; i < 9; i++) {
found = false;
do {
digit = rand() % 9;
found = placed[digit] == 0;
if (found)
placed[digit] = 1;
} while (!found);
do {
j = rand() % 3;
k = rand() % 3;
found = board[j][k] == 0;
if (found)
board[j][k] = digit;
} while (!found);
}
}
/*
Puzzle(int p) {
int i, j;
int digit[9] = {1, 2, 3, 8, 0, 4, 7, 6, 5};
vector<int> digitVector(digit, digit + 9);
g = nodesExpanded = 0;
for (i = 0; i < p; i++)
next_permutation(digitVector.begin(),
digitVector.end(), less<int>());
for (i = 0; i < 3; i++)
for (j = 0; j < 3; j++)
board[i][j] = digitVector[i * 3 + j];
}
Puzzle(int p) {
// 4 nodes at depth 1 and 2 nodes at depth 2
int b[6][9] = {{1, 0, 3, 8, 2, 4, 7, 6, 5}, {1, 2, 3,
0, 8, 4, 7, 6, 5},
{1, 2, 3, 8, 4, 0, 7, 6, 5}, {1, 2, 3, 8, 6, 4, 7, 0,
5},
{0, 1, 3, 8, 2, 4, 7, 6, 5}, {1, 3, 0, 8, 2, 4, 7, 6,
5}};
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
board[i][j] = b[p][i * 3 + j];
}
*/
Puzzle (int d) {
int b, i, j, k;
int goal[3][3] = {{1, 2, 3}, {8, 0, 4}, {7, 6, 5}};
int tempSquare[BranchingFactor][3][3];
g = nodesExpanded = 0;
for (i = 0; i < 3; i++)
for (j = 0; j < 3; j++)
board[i][j] = goal[i][j];
for (i = 0; i <= d; i++) {
b = expand(board, tempSquare);
b = rand() % b;
for (j = 0; j < 3; j++)
for (k = 0; k < 3; k++)
board[j][k] =
tempSquare[b][j][k];
}
}
int getNodesExpanded(void) {
return nodesExpanded;
}
int expand(int square[3][3], int tempSquare[4][3][3]) {
int b, col, i, j, k, row;
for (i = 0; i < 4; i++)
for (j = 0; j < 3; j++)
for (k = 0; k < 3; k++)
tempSquare[i][j][k] =
square[j][k];
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
if (square[i][j] == 0) {
row = i;
col = j;
break;
}
}
}
if (row == 0 && col == 0) {
tempSquare[0][0][0] = tempSquare[0][0][1];
tempSquare[0][0][1] = 0;
tempSquare[1][0][0] = tempSquare[1][1][0];
tempSquare[1][1][0] = 0;
b = 2;
}
else if (row == 0 && col == 1) {
tempSquare[0][0][1] = tempSquare[0][0][0];
tempSquare[0][0][0] = 0;
tempSquare[1][0][1] = tempSquare[1][1][1];
tempSquare[1][1][1] = 0;
tempSquare[2][0][1] = tempSquare[2][0][2];
tempSquare[2][0][2] = 0;
b = 3;
}
else if (row == 0 && col == 2) {
tempSquare[0][0][2] = tempSquare[0][0][1];
tempSquare[0][0][1] = 0;
tempSquare[1][0][2] = tempSquare[1][1][2];
tempSquare[1][1][2] = 0;
b = 2;
}
else if (row == 1 && col == 0) {
tempSquare[0][1][0] = tempSquare[0][0][0];
tempSquare[0][0][0] = 0;
tempSquare[1][1][0] = tempSquare[1][1][1];
tempSquare[1][1][1] = 0;
tempSquare[2][1][0] = tempSquare[2][2][0];
tempSquare[2][2][0] = 0;
b = 3;
}
else if (row == 1 && col == 1) {
tempSquare[0][1][1] = tempSquare[0][1][0];
tempSquare[0][1][0] = 0;
tempSquare[1][1][1] = tempSquare[1][0][1];
tempSquare[1][0][1] = 0;
tempSquare[2][1][1] = tempSquare[2][1][2];
tempSquare[2][1][2] = 0;
tempSquare[3][1][1] = tempSquare[3][2][1];
tempSquare[3][2][1] = 0;
b = 4;
}
else if (row == 1 && col == 2) {
tempSquare[0][1][2] = tempSquare[0][0][2];
tempSquare[0][0][2] = 0;
tempSquare[1][1][2] = tempSquare[1][1][1];
tempSquare[1][1][1] = 0;
tempSquare[2][1][2] = tempSquare[2][2][2];
tempSquare[2][2][2] = 0;
b = 3;
}
else if (row == 2 && col == 0) {
tempSquare[0][2][0] = tempSquare[0][1][0];
tempSquare[0][1][0] = 0;
tempSquare[1][2][0] = tempSquare[1][2][1];
tempSquare[1][2][1] = 0;
b = 2;
}
else if (row == 2 && col == 1) {
tempSquare[0][2][1] = tempSquare[0][2][0];
tempSquare[0][2][0] = 0;
tempSquare[1][2][1] = tempSquare[1][1][1];
tempSquare[1][1][1] = 0;
tempSquare[2][2][1] = tempSquare[2][2][2];
tempSquare[2][2][2] = 0;
b = 3;
}
else if (row == 2 && col == 2) {
tempSquare[0][2][2] = tempSquare[0][2][1];
tempSquare[0][2][1] = 0;
tempSquare[1][2][2] = tempSquare[1][1][2];
tempSquare[1][1][2] = 0;
b = 2;
}
return b;
}
int heuristic(int square[3][3]) {
return ManhattenDistance(square);
}
bool move(void) {
int b, count, f[4], i, index[4], j, k, min;
int tempSquare[4][3][3];
b = expand(board, tempSquare);
for (i = 0; i < b; i++) {
f[i] = g + heuristic(tempSquare[i]);
for (j = 0; j < 3; j++)
for (k = 0; k < 3; k++)
board[j][k] =
tempSquare[i][j][k];
if (board[0][0] == 1 && board[0][1] == 2 &&
board[0][2] == 3 &&
board[1][0] == 8 && board[1][1] == 0
&& board[1][2] == 4 &&
board[2][0] == 7 && board[2][1] == 6
&& board[2][2] == 5)
return true;
}
// find the node of minimum f
min = f[0];
for (i = 1; i < b; i++)
if (f[i] < min)
min = f[i];
for (count = i = 0; i < b; i++)
if (f[i] == min)
index[count++] = i;
i = index[rand() % count];
// increment the cost of the path thus far
g++;
nodesExpanded += b;
for (j = 0; j < 3; j++)
for (k = 0; k < 3; k++)
board[j][k] = tempSquare[i][j][k];
return false;
}
int outOfPlace(int square[3][3]) {
int i, j, oop = 0;
int goal[3][3] = {{1, 2, 3}, {8, 0, 4}, {7, 6, 5}};
for (i = 0; i < 3; i++)
for (j = 0; j < 3; j++)
if (square[i][j] != goal[i][j])
oop++;
return oop;
}
int ManhattenDistance(int square[3][3]) {
// city block or Manhatten distance heuristic
int md = 0;
if (square[0][0] == 1)
md += 0;
else if (square[0][0] == 2)
md += 1;
else if (square[0][0] == 3)
md += 2;
else if (square[0][0] == 4)
md += 3;
else if (square[0][0] == 5)
md += 4;
else if (square[0][0] == 6)
md += 3;
else if (square[0][0] == 7)
md += 2;
else if (square[0][0] == 8)
md += 1;
if (square[0][1] == 1)
md += 1;
else if (square[0][1] == 2)
md += 0;
else if (square[0][1] == 3)
md += 1;
else if (square[0][1] == 4)
md += 2;
else if (square[0][1] == 5)
md += 3;
else if (square[0][1] == 6)
md += 2;
else if (square[0][1] == 7)
md += 3;
else if (square[0][1] == 8)
md += 2;
if (square[0][2] == 1)
md += 2;
else if (square[0][2] == 2)
md += 1;
else if (square[0][2] == 3)
md += 0;
else if (square[0][2] == 4)
md += 1;
else if (square[0][2] == 5)
md += 2;
else if (square[0][2] == 6)
md += 3;
else if (square[0][2] == 7)
md += 4;
else if (square[0][2] == 8)
md += 3;
if (square[1][0] == 1)
md += 1;
else if (square[1][0] == 2)
md += 2;
else if (square[1][0] == 3)
md += 3;
else if (square[1][0] == 4)
md += 2;
else if (square[1][0] == 5)
md += 3;
else if (square[1][0] == 6)
md += 2;
else if (square[1][0] == 7)
md += 1;
else if (square[1][0] == 8)
md += 0;
if (square[1][1] == 1)
md += 2;
else if (square[1][1] == 2)
md += 1;
else if (square[1][1] == 3)
md += 2;
else if (square[1][1] == 4)
md += 1;
else if (square[1][1] == 5)
md += 2;
else if (square[1][1] == 6)
md += 1;
else if (square[1][1] == 7)
md += 2;
else if (square[1][1] == 8)
md += 1;
if (square[1][2] == 1)
md += 3;
else if (square[1][2] == 2)
md += 2;
else if (square[1][2] == 3)
md += 1;
else if (square[1][2] == 4)
md += 0;
else if (square[1][2] == 5)
md += 1;
else if (square[1][2] == 6)
md += 2;
else if (square[1][2] == 7)
md += 3;
else if (square[1][2] == 8)
md += 2;
if (square[2][0] == 1)
md += 2;
else if (square[2][0] == 2)
md += 3;
else if (square[2][0] == 3)
md += 4;
else if (square[2][0] == 4)
md += 3;
else if (square[2][0] == 5)
md += 2;
else if (square[2][0] == 6)
md += 1;
else if (square[2][0] == 7)
md += 0;
else if (square[2][0] == 8)
md += 1;
if (square[2][1] == 1)
md += 3;
else if (square[2][1] == 2)
md += 2;
else if (square[2][1] == 3)
md += 3;
else if (square[2][1] == 4)
md += 2;
else if (square[2][1] == 5)
md += 1;
else if (square[2][1] == 6)
md += 0;
else if (square[2][1] == 7)
md += 1;
else if (square[2][1] == 8)
md += 2;
if (square[2][2] == 1)
md += 4;
else if (square[2][2] == 2)
md += 3;
else if (square[2][2] == 3)
md += 2;
else if (square[2][2] == 4)
md += 1;
else if (square[2][2] == 5)
md += 0;
else if (square[2][2] == 6)
md += 1;
else if (square[2][2] == 7)
md += 2;
else if (square[2][2] == 8)
md += 3;
return md;
}
void print(void) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++)
cout << board[i][j] << ' ';
cout << endl;
}
cout << endl;
}
int solve(void) {
int m = 1;
while (!move() && m < MaxMoves)
m++;
return m;
}
};
int main(void) {
int i, moves;
int converged = 0,totalMoves = 0, totalNodes = 0;
srand(time(NULL));
for (i = BaseDepth; i < LimitDepth; i++) {
Puzzle puzzle(i);
moves = puzzle.solve();
if (moves < MaxMoves) {
converged++;
totalMoves += moves;
totalNodes += puzzle.getNodesExpanded();
cout << moves << endl;
}
}
cout << "convergence percentage: " << 100.0 * converged /
DepthInterval << endl;
cout << "average moves: " << (double) totalMoves / converged
<< endl;
cout << "average nodes expanded: " << (double) totalNodes /
DepthInterval << endl;
return 0;
}
==Pate Williams==
[EMAIL PROTECTED]
http://www.mindspring.com/~pate
------------------------------
From: [EMAIL PROTECTED] (wtshaw)
Subject: Cursory Comments on Recursion
Date: Tue, 25 Jul 2000 22:01:54 -0600
I have extended my studies of bases used in pseudorandom series to include
all bases 13 to 94. With objective data based on the ability of different
length seeds, or primers, to parent series meeting minimal criteria, I
have graded the 82 bases as Best(4), Better(34), Good(33), Fair(5),
Poor(2), Bad(2), Terrible(1), and Worst(1).
The scale was from definitively 3 to 10, Best to Worse. Each category can
be further broken down, but the probability of error due to misplaced
interpolation increases with such a effort; as many things in crypto,
evaluation is best kept to one significant figure.
I was surprised to see the full results, that the Best Bases in recursion
are 66, 78, 93, and 94, and that the bottom five categories include the
most popular bases recursively used in so-called modern algorithms.
The common wisdom is that prime numbers are best for encryptive bases, but
the data seems to say, if anything, that bases of all integer powers of
low primes, 2, 3, 5, and 6, with a very few unpredicted others, are
ill-suited as compared with others for recursive usage.
The technique was not designed to prove a prejudice, as both bits and
trits come out way down the list, but to take an impartial and comparative
look at a few useful bases. Somehow, a number of my favorites do well, as
a few go down in flames.
The lessons in the results of this study are subtile in a quest for
resistance to analysis.
--
Pat B. reminds us that he served in the Nixon Administration for
six years. How can he be proud of that?
------------------------------
From: [EMAIL PROTECTED]
Subject: Re: It has been documented / disclosed in the past that ...
Date: Wed, 26 Jul 2000 04:53:04 GMT
jungle <[EMAIL PROTECTED]> wrote:
> it has been documented / disclosed in the past that :
> ======================================================
> - K Mitnick case - his encrypted files has not been cracked
> - Ramzi Yousef WTC bomber - it took FBI experts more than a year to decipher 2
> files
> QUESTION : what has been used as encryption [software, algorithm, method] ?
In Mitnick's case, word of mouth would seem to indicate multiple
iterations of DES. He allegadly had confidence in the algorithm
[Littman, The Fugitive Game pp98-99]. Given the time frame involved,
I'm not sure there were many ready-made programs offering much
superior protection.
On a related note, there isn't really any incentive to decrypt his
files. The government already had an overwhelming case against
him. Alot of them are most likely trash as well. His friend encrypted
a pile of garbage multiple times prior to being raided. [Littman pp
54-55]
--
Matt Gauthier <[EMAIL PROTECTED]>
------------------------------
** FOR YOUR REFERENCE **
The service address, to which questions about the list itself and requests
to be added to or deleted from it should be directed, is:
Internet: [EMAIL PROTECTED]
You can send mail to the entire list (and sci.crypt) via:
Internet: [EMAIL PROTECTED]
End of Cryptography-Digest Digest
******************************