bbonkr / crypto-js

Automatically exported from code.google.com/p/crypto-js
0 stars 0 forks source link

BASE64 encode/decode failure #45

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
What steps will reproduce the problem?
1. simple test script for base64 encode/decoder...

What is the expected output? What do you see instead?
-Used text from Wikipedia base64 page; text does NOT match.

Please provide any additional information below.

<!DOCTYPE HTML>
<HTML>
<HEAD>
<META charset="utf-8">
<TITLE>De/Encode string -> BASE64</TITLE>
<SCRIPT src="javascript/crypto/components/core.js"></SCRIPT>
<SCRIPT src="javascript/crypto/components/cipher-core.js"></SCRIPT>
<SCRIPT src="javascript/crypto/components/enc-utf16.js"></SCRIPT>
<SCRIPT src="javascript/crypto/components/enc-base64.js"></SCRIPT>
</HEAD>

<BODY>
<SCRIPT language="javascript">
    var nextLine="<BR>";

//http://en.wikipedia.org/wiki/Base64
    var strWikiText= "Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.";
    var strWikiB64 ="TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=";

    /*

    var str     = '48656c6c6f2c20576f726c6421';
    var words = CryptoJS.enc.Hex.parse(str);
    var hex   = CryptoJS.enc.Hex.stringify(str);
    document.writeln(str +nextLine + words +nextLine + hex +"<HR>");
    */

    var word8 = CryptoJS.enc.Utf8.parse(strHttp);
    document.writeln(word8 +nextLine );
    var utf8  = word8.toString(CryptoJS.enc.Utf8);
    document.writeln( utf8 +"<HR>");

    /*
    var str  = "AXLBOX";
    var hash = CryptoJS.enc.Utf16.parse(str);
    var words  = hash.toString(CryptoJS.enc.Base64);// use this for the AES key
    document.writeln(strHttp +nextLine + str +nextLine + hash +nextLine + words +nextLine);
    var encrypted = CryptoJS.AES.encrypt(strHttp, words);
    var decrypted = CryptoJS.AES.decrypt(encrypted, words);
    document.writeln(nextLine +encrypted +nextLine + nextLine +decrypted +"<HR>");
    */

    var wordT = CryptoJS.enc.Base64.parse(strWikiText);
    var words = CryptoJS.enc.Base64.parse(strWikiB64);
    var base64 = wordT.toString(CryptoJS.enc.Base64);

    document.writeln(  decode64(strWikiB64) +nextLine + "<HR>");
    document.writeln(wordT +nextLine + words +nextLine + base64 +nextLine + "<HR>");

///
/// testing this crypto lib against known values as provided by 
http://en.wikipedia.org/wiki/Base64
///
    var testString="any carnal pleasure.";
    var x=testString.length;
    for (x=testString.length; x>testString.length-6; x--) {
        var tempStr=testString.substr(0, x);
        document.writeln("Input: " + tempStr + " ; Output: " + CryptoJS.enc.Base64.parse(tempStr) +nextLine);
    }//end for x

</SCRIPT>
</BODY>
</HTML>

Original issue reported on code.google.com by lorez...@gmail.com on 12 Aug 2012 at 1:07

GoogleCodeExporter commented 9 years ago
I found this javascript code to work perfectly as expected. Please update your 
source to work accordingly.

// This code was written by Tyler Akins and has been placed in the
// public domain.  It would be nice if you left this header intact.
// Base64 code from Tyler Akins -- http://rumkin.com

var keyStr = 
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

function encode64(input) {
   if (!String(input).length) return false;
   var output = "";
   var chr1, chr2, chr3;
   var enc1, enc2, enc3, enc4;
   var i = 0;

   do {
      chr1 = input.charCodeAt(i++);
      chr2 = input.charCodeAt(i++);
      chr3 = input.charCodeAt(i++);

      enc1 = chr1 >> 2;
      enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
      enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
      enc4 = chr3 & 63;

      if (isNaN(chr2)) {
         enc3 = enc4 = 64;
      } else if (isNaN(chr3)) {
         enc4 = 64;
      }

      output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + 
         keyStr.charAt(enc3) + keyStr.charAt(enc4);
   } while (i < input.length);

   return output;
}

function decode64(input) {
   if (!input) return false;
   var output = "";
   var chr1, chr2, chr3;
   var enc1, enc2, enc3, enc4;
   var i = 0;

   // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
   input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

   do {
      enc1 = keyStr.indexOf(input.charAt(i++));
      enc2 = keyStr.indexOf(input.charAt(i++));
      enc3 = keyStr.indexOf(input.charAt(i++));
      enc4 = keyStr.indexOf(input.charAt(i++));

      chr1 = (enc1 << 2) | (enc2 >> 4);
      chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
      chr3 = ((enc3 & 3) << 6) | enc4;

      output = output + String.fromCharCode(chr1);

      if (enc3 != 64) {
         output = output + String.fromCharCode(chr2);
      }
      if (enc4 != 64) {
         output = output + String.fromCharCode(chr3);
      }
   } while (i < input.length);

   return output;
}

Original comment by lorez...@gmail.com on 12 Aug 2012 at 1:09

GoogleCodeExporter commented 9 years ago
Hi, rbartlett_jr. I appreciate your taking the time to create tests, but your 
test page has a number problems. You're trying to use variables that are 
undeclared and undefined (e.g., strHttp); you're trying to parse non-base64 
strings as base64 (e.g., strWikiText, and again with testString); and you're 
using non-existent functions (e.g., decode64).

Below is your test page but corrected, and the output is exactly as expected.

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>de/encode string -> base64</title>
        <script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/components/core.js"></script>
        <script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/components/cipher-core.js"></script>
        <script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/components/enc-utf16.js"></script>
        <script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/components/enc-base64.js"></script>
    </head>
    <body>
        <script>
            var strWikiText = "Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.";
            var strWikiB64  = "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=";

            document.write(
                "expected: " + strWikiB64 + "<br>" +
                "actual: " + CryptoJS.enc.Latin1.parse(strWikiText).toString(CryptoJS.enc.Base64) +
                "<hr>"
            );

            var testString = "any carnal pleasure.";
            for (var x = testString.length; x > testString.length - 6; x--) {
                var tempStr = testString.substr(0, x);

                document.write("Input: " + tempStr + " ; Output: " + CryptoJS.enc.Latin1.parse(tempStr).toString(CryptoJS.enc.Base64) + '<br>');
            }
        </script>
    </body>
</html>

Original comment by Jeff.Mott.OR on 12 Aug 2012 at 3:41

GoogleCodeExporter commented 9 years ago
The sections that used the var strHttp were not required for this issue and I 
stripped it out before posting. In fact, the sections not related to base64 
should be ignored. I failed to remove those sections prior to posting.

Thank you for the clarification. I have confirmed that it does work as you have 
explained.
You may consider using this for your FAQ / demo section as the example 
demostrating base64 encode/decoding can be a bit confusing (at first).

<script>
    var nextLine="<BR>";

//http://en.wikipedia.org/wiki/Base64
    var strWikiText= "Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.";
    var strWikiB64 ="TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=";

///
/// testing this crypto lib against known values as provided by 
http://en.wikipedia.org/wiki/Base64
///
             document.write(
                  "Text: " + CryptoJS.enc.Base64.parse(strWikiB64).toString(CryptoJS.enc.Latin1) +nextLine +
                "expected: " + strWikiB64 +nextLine +
                 "actual: " +
CryptoJS.enc.Latin1.parse(strWikiText).toString(CryptoJS.enc.Base64) +
                 "<hr>"
             );

             var testString = "any carnal pleasure.";
             for (var x = testString.length; x > testString.length - 6; x--) {
                 var tempStr = testString.substr(0, x);

                 document.write("Input: " + tempStr + " ; Output: " +
CryptoJS.enc.Latin1.parse(tempStr).toString(CryptoJS.enc.Base64) + '<br>');
             }

</script>

Original comment by lorez...@gmail.com on 12 Aug 2012 at 5:51