| Category: | Cryptography |
| Author/Contact Info | Wombat |
| Description: | I recognize that this is not a security group, but I figure there must be at least a few cypherpunks in the lot of you. I came up with this scheme for encrypting text, and submit it to you to see if anyone can come up with any obvious holes. The way this works, is a user types a passphrase which gets turned into a number between 0 and the maximum size of an integer (4,294,967,924). This number then is used to seed the random number generator. The program then collects single numbers between 0 and 7 by repeatedly calling rand(), until it has a bit vector. Then for each character of input, it maps the characters bits to the bit vector producing a scrambled character which it prints to STDOUT. By entering the same passphrase again, you get the same srand seed and thus can decrypt your bits at a later date. Features include: Arbitrarily long passphrases: Type as much as you like, the seed won't mind. Non-portability: (It's not a bug!) I realize that everyone has different random number generators. That's okay. I'm mostly using this to lock down my own personal secret files. I don't think the security would be compromised too much if a person sent the particulars of their random number generator along with cyphercode if they wanted a friend to get a message. No way to decrypt the text: I haven't coded the decryptor yet, so as of now, once encrypted, things STAY encrypted! :-) So yeah! Like, peer-review me and stuff! BTW: I do realize that this is "Weak security" at best, and probably can be defeated by brute force if so desired. I know. But BESIDES that... :-) ~W |
#!/usr/bin/perl -w
$key=0; #Initialize variables.
$updown=0;
$i=0;
@arrdone=(0,0,0,0,0,0,0,0);
print "Enter passphrase: ";
$phrase=<STDIN>;
chomp $phrase;
@letters = split //,$phrase;
foreach $CHAR (@letters) { #Use phrase to create random seed
$newbits=ord($CHAR);
$modulo = $newbits % 10;
if ($updown == 0) {
if ($key < 0){$key*=-1;}
$key=$key*($modulo+1);
$key+=$newbits;
if ($key>4294967294){$updown=1;}
}
if ($updown == 1) {
$key=$key/($modulo+1)-($key%($modulo+1)/($modulo+1));
$key-=$newbits;
if ($key<0){$updown=0;}
}
}
srand $key;
while(<STDIN>) {
chomp;
@inputchars = split //;
foreach $CHAR (@inputchars){
$charnum=ord($CHAR);
$oldt=$charnum;
for (0..8) { #Translate the input char into binary
$t = $charnum % (2**$_);
if($t==$oldt) {
$binarr[8-$_]=0;
}else {$binarr[8-$_]=1;}
$oldt=$t;
}
while ($i<8) { #Assemble the key bit vector.
$randout=rand(8)%8;
if ($arrdone[$randout]==0) {
$shifter[$i]=$randout;
$arrdone[$randout]=1;
$i++;
}
}
for(0..7) { #Assemble the scrambled bit vector.
if ($binarr[$_]==1) {
$outchar[$shifter[$_]] = 1;
}
else {$outchar[$shifter[$_]] =0;}
}
for(0..7) { #Rejoin the new bits to an ord
if ($outchar[$_]==1) {
$sum+=2**(7-$_);
}
}
$och= chr($sum); #Print the char.
print $och;
$i=0; #Reset variables
$sum=0;
for(0..7){
$outchar[$_]=0;
$arrdone[$_]=0;
$shifter[$_]=0;
}
}
}
|
|
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Wombat's Bit Scrambler
by arhuman (Vicar) on Mar 10, 2001 at 02:46 UTC | |
by TStanley (Canon) on Mar 10, 2001 at 02:58 UTC | |
by arhuman (Vicar) on Mar 10, 2001 at 03:02 UTC | |
| |
|
Re: Wombat's Bit Scrambler
by bladx (Chaplain) on Mar 10, 2001 at 21:28 UTC | |
by Anonymous Monk on Sep 16, 2002 at 01:27 UTC | |
|
Re (tilly) 1: Wombat's Bit Scrambler
by tilly (Archbishop) on Mar 10, 2001 at 02:32 UTC |