The code below is a Perl version of an encryption/hashing algorithm used by OpenOffice to generate pseudo passwords for Excel worksheets. The input is a single 16 bit integer.
Does anyone recognise the algorithm or methodology used.
Apologies for being off-topic.
sub Decode {
my $nPasswd = shift || 0;
my $sPasswd = '';
my $sDummy = '';
my $nLen = 9;
my $nDummy = 0;
my $nNewChar = 0;
$nPasswd ^= 0xCE4B;
$nDummy = $nPasswd;
while ( !($nDummy & 0x8000) && $nLen ) {
$nLen--;
$nDummy <<= 1;
}
if ( !$nLen ) {
$nLen = 2;
}
if ( ($nLen ^ $nPasswd) & 0x0001 ) {
$nLen++;
}
if ( $nLen == 9 ) {
$nLen = 10;
$nPasswd ^= 0x8001;
}
$nPasswd ^= $nLen;
if ( $nLen < 9 ) {
$nPasswd <<= (8 - $nLen);
}
for ( my $iChar = $nLen; $iChar > 0; $iChar-- ) {
if ($iChar == 10) {
$nNewChar = ($nPasswd & 0xC000) | 0x0400;
$nPasswd ^= $nNewChar;
$nNewChar >>= 2;
} elsif ($iChar == 9) {
$nNewChar = 0x4200;
$nPasswd ^= $nNewChar;
$nNewChar >>= 1;
} elsif ($iChar == 1) {
$nNewChar = $nPasswd & 0xFF00;
} else {
$nNewChar = ($nPasswd & 0xE000) ^ 0x2000;
if ( !$nNewChar ) {
$nNewChar = ($nPasswd & 0xF000) ^ 0x1800;
}
if ( $nNewChar == 0x6000 ) {
$nNewChar = 0x6100;
}
$nPasswd ^= $nNewChar;
$nPasswd <<= 1;
}
$nNewChar >>= 8;
$nNewChar &= 0x00FF;
$sPasswd .= chr $nNewChar;
}
print "<$sPasswd>\n\n";
}
John.
--