timkurvers / as3-crypto

Fork of Henri Torgemane's excellent as3 cryptography library
http://code.google.com/p/as3crypto
Other
93 stars 46 forks source link

RSA encryption using public key from PEM certificate file and decryption using private key from PEM key file crashes at decryption #9

Closed ghost closed 11 years ago

ghost commented 11 years ago

Hi,

I am a non-Flex person but was experimenting the AS3Crypto functionalities with Flex .swf embeded into the SAP backend. I am using the original library v1.3 in my flex project. The Symmetric algorithms provided are working fine, but while I was testing the RSA Asymmetric algorithm along with PEM files, its crashing. Please let me know if I am doing something wrong and how to correct it?

Below is my code used for testing the RSA encryption/decryption. It crashes during decryption saying: "TypeError: Error #1009: Cannot access a property or method of a null object reference."

Code I wrote for testing:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
                xmlns="*" creationComplete="onCreationComplete();">
    <mx:Script>
        <![CDATA[
            import com.hurlant.crypto.Crypto;
            import com.hurlant.crypto.rsa.RSAKey;
            import com.hurlant.crypto.symmetric.AESKey;
            import com.hurlant.crypto.symmetric.ICipher;
            import com.hurlant.crypto.symmetric.IPad;
            import com.hurlant.crypto.symmetric.IVMode;
            import com.hurlant.crypto.symmetric.NullPad;
            import com.hurlant.crypto.symmetric.PKCS5;
            import com.hurlant.crypto.prng.Random;          
            import com.hurlant.util.Hex;
            import mx.utils.Base64Encoder;          
            import mx.utils.Base64Decoder;
            import mx.controls.Alert;
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;
            import com.hurlant.crypto.cert.X509CertificateCollection;
            import com.hurlant.crypto.cert.X509Certificate;
            import com.hurlant.util.der.PEM;

            private var pmode:String;           

            private var myCertstr:String = "-----BEGIN CERTIFICATE-----\n"+
                                           "MIID4zCCA0ygAwIBAgIJAL7k5X3sCvniMA0GCSqGSIb3DQEBBQUAMIGoMQswCQYD\n"+
                                           "VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTERMA8GA1UEBxMIU2FuIEpvc2Ux\n"+
                                           "FDASBgNVBAoTC2h1cmxhbnQuY29tMRcwFQYDVQQLEw5hczMgY3J5cHRvIGxpYjEY\n"+
                                           "MBYGA1UEAxMPSGVucmkgVG9yZ2VtYW5lMSgwJgYJKoZIhvcNAQkBFhloZW5yaV90\n"+
                                           "b3JnZW1hbmVAeWFob28uY29tMB4XDTA3MTEwNTA1MjUyOVoXDTA4MTEwNDA1MjUy\n"+
                                           "OVowgagxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMREwDwYDVQQH\n"+
                                           "EwhTYW4gSm9zZTEUMBIGA1UEChMLaHVybGFudC5jb20xFzAVBgNVBAsTDmFzMyBj\n"+
                                           "cnlwdG8gbGliMRgwFgYDVQQDEw9IZW5yaSBUb3JnZW1hbmUxKDAmBgkqhkiG9w0B\n"+
                                           "CQEWGWhlbnJpX3RvcmdlbWFuZUB5YWhvby5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD\n"+
                                           "gY0AMIGJAoGBAOgqUvOkl4tyg9hBBg9rR2IzjOln7Ssp5HGHH2yyr3UPPAB5KYzv\n"+
                                           "BPTdYuItmSo+3YxLe42jvnMrlG2aMeoXo6N+za1tJ2UIrm2mKy84Cyy6rSjm8jOD\n"+
                                           "8yFLY8iKOcG1UH1cVJNfGG94p4irVWB0HbAdb3n7OEEX5nWGxhw1FEUXAgMBAAGj\n"+
                                           "ggERMIIBDTAdBgNVHQ4EFgQU/XyNp2QghYm3MWOU5YoUoFWcTKMwgd0GA1UdIwSB\n"+
                                           "1TCB0oAU/XyNp2QghYm3MWOU5YoUoFWcTKOhga6kgaswgagxCzAJBgNVBAYTAlVT\n"+
                                           "MRMwEQYDVQQIEwpDYWxpZm9ybmlhMREwDwYDVQQHEwhTYW4gSm9zZTEUMBIGA1UE\n"+
                                           "ChMLaHVybGFudC5jb20xFzAVBgNVBAsTDmFzMyBjcnlwdG8gbGliMRgwFgYDVQQD\n"+
                                           "Ew9IZW5yaSBUb3JnZW1hbmUxKDAmBgkqhkiG9w0BCQEWGWhlbnJpX3RvcmdlbWFu\n"+
                                           "ZUB5YWhvby5jb22CCQC+5OV97Ar54jAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB\n"+
                                           "BQUAA4GBABsXUJjiRAz+FeiVq4JMSBWeiiGcXTw+8sNv8SfWaWx3su+AgooKlBn3\n"+
                                           "nsGKf3BEDdmJCOSgY0+A5Pce9SRoAMhabHKwoLEogrtp2p8vRj2OTMjWBW7ylrxj\n"+
                                           "FvUpFdc8qFaqTtgH6+JiIYllGFlcsSV+6d9fDPaFDZEHjz5GweWJ\n"+
                                           "-----END CERTIFICATE-----" ;  

            private var myprivkeystr:String = "-----BEGIN RSA PRIVATE KEY-----\n"+
                                           "MIICWwIBAAKBgQDoKlLzpJeLcoPYQQYPa0diM4zpZ+0rKeRxhx9ssq91DzwAeSmM\n"
                                           "7wT03WLiLZkqPt2MS3uNo75zK5RtmjHqF6Ojfs2tbSdlCK5tpisvOAssuq0o5vIz\n"+
                                           "g/MhS2PIijnBtVB9XFSTXxhveKeIq1VgdB2wHW95+zhBF+Z1hsYcNRRFFwIDAQAB\n"+
                                           "AoGAI8wK2EhjmXvBuoFkJtJ6wjiCnKaKmiIueBbGkKMIjLsZnFUSRAnCsOLF0WwI\n"+
                                           "dswUqwIkfdVmkymADFo/IgIdF9hLGNLRskIPKGZWEUC8d5ZJnRg+nuzi2c2msN5u\n"+
                                           "/BvCCgL5/shBhO5KvrPbU/Fbs/k4saCDQZ2EO4HpueRZWGkCQQD6hC0pTfyW4yQT\n"+
                                           "Qr/dY7FhOwdOh/8ewGyXBa9ruOuZqTR23Ya20O8NuF22+NqW9AZl7uioiTZyZkOV\n"+
                                           "jqAckelrAkEA7T9QVdK+QcaQSznrZPJpXlSIDLSBRWjaPKBoypnNTF3y3JkUQE0L\n"+
                                           "iA0c2oUc8D+LCgx9vA0Ai0IzwzrIec+iBQJAJb5YV4rKbalXPBeodKCajv2nwis3\n"+
                                           "QtjXA4H1xhMcXBBkOSxzKYQdIEIQzIp91JR7ikwOfaX+sAm8UQImGWfadQJAMAb4\n"+
                                           "KVePQluDDGd+OqJEKF9uZzwHS1jNjSZf8FuwTrxaFMQ8cEPoiLM22xnFYPFMIU2k\n"+
                                           "CnSLXqWZOvVkbhxVTQJAL3xIc5AUbhsEp7ZeeJrkPRv5rCObmLw0+wIaERtMX83b\n"+
                                           "PNM0TpzY6EXk+geTCqudAipYF/A7qn38wpOh+PuuVg==\n"+
                                            "-----END RSA PRIVATE KEY-----" ;     

            private function onCreationComplete():void {
                processData();                                                  
            }                                                                              

            private function decryptData():void
            {
             RequestResult.text = "";
             pmode = "DECRYPT"; 
             Decrypt.enabled = false;
             Encrypt.enabled = true;
             processData();
            }               

            private function encryptData():void
            {
             RequestResult.text = "";
             pmode = "ENCRYPT"; 
             Decrypt.enabled = true;
             Encrypt.enabled = false;
             processData();
            }   

            private function processData():void
            {                                                                                                                                                               
             var src:ByteArray;
             var decrypteddata:ByteArray  = new ByteArray;
             var encrypteddata:ByteArray = new ByteArray;                        

             if(pmode == "DECRYPT"){            

              Source.text = "Data to be decrypted";
              Target.text = "Decrypted data";
              Decrypt.enabled = false;
              Encrypt.enabled = true;

              RequestResult.text = ResponseResult.text;
              ResponseResult.text = "";

              // Get the private key from the key file
              var privateRSAKey: RSAKey = PEM.readRSAPrivateKey(myprivkeystr);             

              privateRSAKey.decrypt(encrypteddata, decrypteddata, encrypteddata.length);

              // Convert the decrypted data to its original format
              ResponseResult.text = Hex.toString(Hex.fromArray(decrypteddata)); 

             }  
             else{  
              pmode = "ENCRYPT";                      
              Source.text = "Data to be encrypted";
              Target.text = "Encrypted data";
              Decrypt.enabled = true;
              Encrypt.enabled = false;

              var textstr:String = "test data";
              RequestResult.text = textstr;
              ResponseResult.text = "";

              // Get the public key from the certificate file                   
              var x509cert:X509Certificate = new X509Certificate(PEM.readCertIntoArray(myCertstr));
              var publicRSAKey: RSAKey = x509cert.getPublicKey();            

              // Convert the data to ByteArray          
              src = Hex.toArray(Hex.fromString(textstr));

              publicRSAKey.encrypt(src, encrypteddata, src.length); 

              // Covert the encrypted data into Hex format                    
              ResponseResult.text = Hex.fromArray(encrypteddata);           

            }        

            }                                                                                               

        ]]>
    </mx:Script>    

    <mx:Panel id="Title" width="100%" height="60%" horizontalAlign="left" paddingBottom="5"
              paddingLeft="5" paddingRight="5" paddingTop="5" title="Certificate test with RSA">
        <mx:Label id="Source" text="" fontWeight="bold" height="5%"/>
        <mx:TextArea id="RequestResult" text= "" editable="false" width="100%" height="44.5%"/>
        <mx:Label id="Target" text="" fontWeight="bold" height="5%"/>
        <mx:TextArea id="ResponseResult" text="" editable="false" width="100%" height="44.5%"/>     
        <mx:Button id="Decrypt" label="Decrypt Data" width="5%" height="0.5%" click="decryptData()"/>
        <mx:Button id="Encrypt" label="Encrypt Data" width="5%" height="0.5%" click="encryptData()"/>
     </mx:Panel>     

</mx:Application>
ghost commented 11 years ago

sorry, I think the files (host.cert and host.key) had some issue from where I had used the earlier keys. Its working with another pair of files with below code. So, closing the issue.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
                xmlns="*" creationComplete="onCreationComplete();">
    <mx:Script>
        <![CDATA[
            import com.hurlant.crypto.Crypto;
            import com.hurlant.crypto.rsa.RSAKey;
            import com.hurlant.crypto.symmetric.AESKey;
            import com.hurlant.crypto.symmetric.ICipher;
            import com.hurlant.crypto.symmetric.IPad;
            import com.hurlant.crypto.symmetric.IVMode;
            import com.hurlant.crypto.symmetric.NullPad;
            import com.hurlant.crypto.symmetric.PKCS5;
            import com.hurlant.crypto.prng.Random;          
            import com.hurlant.util.Hex;
            import mx.utils.Base64Encoder;          
            import mx.utils.Base64Decoder;
            import mx.controls.Alert;
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;
            import com.hurlant.crypto.cert.X509CertificateCollection;
            import com.hurlant.crypto.cert.X509Certificate;
            import com.hurlant.util.der.PEM;

            private var pmode:String;    
            private var src:ByteArray;
            private var decrypteddata:ByteArray;
            private var encrypteddata:ByteArray;                   

            private var myCertstr:String = "-----BEGIN CERTIFICATE-----\n"+
"MIICVjCCAb8CAg37MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG\n"+
"A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE\n"+
"MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl\n"+
"YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw\n"+
"ODIyMDUyNzIzWhcNMTcwODIxMDUyNzIzWjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE\n"+
"CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs\n"+
"ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMYBBrx5PlP0WNI/ZdzD\n"+
"+6Pktmurn+F2kQYbtc7XQh8/LTBvCo+P6iZoLEmUA9e7EXLRxgU1CVqeAi7QcAn9\n"+
"MwBlc8ksFJHB0rtf9pmf8Oza9E0Bynlq/4/Kb1x+d+AyhL7oK9tQwB24uHOueHi1\n"+
"C/iVv8CSWKiYe6hzN1txYe8rAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAASPdjigJ\n"+
"kXCqKWpnZ/Oc75EUcMi6HztaW8abUMlYXPIgkV2F7YanHOB7K4f7OOLjiz8DTPFf\n"+
"jC9UeuErhaA/zzWi8ewMTFZW/WshOrm3fNvcMrMLKtH534JKvcdMg6qIdjTFINIr\n"+
"evnAhf0cwULaebn+lMs8Pdl7y37+sfluVok=\n"+
                                           "-----END CERTIFICATE-----" ;  

            private var myprivkeystr:String = "-----BEGIN RSA PRIVATE KEY-----\n"+
"MIICWwIBAAKBgQDGAQa8eT5T9FjSP2Xcw/uj5LZrq5/hdpEGG7XO10IfPy0wbwqP\n"+
"j+omaCxJlAPXuxFy0cYFNQlangIu0HAJ/TMAZXPJLBSRwdK7X/aZn/Ds2vRNAcp5\n"+
"av+Pym9cfnfgMoS+6CvbUMAduLhzrnh4tQv4lb/AkliomHuoczdbcWHvKwIDAQAB\n"+
"AoGAXzxrIwgmBHeIqUe5FOBnDsOZQlyAQA+pXYjCf8Rll2XptFwUdkzAUMzWUGWT\n"+
"G5ZspA9l8Wc7IozRe/bhjMxuVK5yZhPDKbjqRdWICA95Jd7fxlIirHOVMQRdzI7x\n"+
"NKqMNQN05MLJfsEHUYtOLhZE+tfhJTJnnmB7TMwnJgc4O5ECQQD8oOJ45tyr46zc\n"+
"OAt6ao7PefVLiW5Qu+PxfoHmZmDV2UQqeM5XtZg4O97VBSugOs3+quIdAC6LotYl\n"+
"/6N+E4y3AkEAyKWD2JNCrAgtjk2bfF1HYt24tq8+q7x2ek3/cUhqwInkrZqOFoke\n"+
"x3+yBB879TuUOadvBXndgMHHcJQKSAJlLQJAXRuGnHyptAhTe06EnHeNbtZKG67p\n"+
"I4Q8PJMdmSb+ZZKP1v9zPUxGb+NQ+z3OmF1T8ppUf8/DV9+KAbM4NI1L/QJAdGBs\n"+
"BKYFObrUkYE5+fwwd4uao3sponqBTZcH3jDemiZg2MCYQUHu9E+AdRuYrziLVJVk\n"+
"s4xniVLb1tRG0lVxUQJASfjdGT81HDJSzTseigrM+JnBKPPrzpeEp0RbTP52Lm23\n"+
"YARjLCwmPMMdAwYZsvqeTuHEDQcOHxLHWuyN/zgP2A==\n"+
                                            "-----END RSA PRIVATE KEY-----" ;     

            private function onCreationComplete():void {
                processData();                                                  
            }                                                                              

            private function decryptData():void
            {
             RequestResult.text = "";
             pmode = "DECRYPT"; 
             Decrypt.enabled = false;
             Encrypt.enabled = true;
             processData();
            }               

            private function encryptData():void
            {
             RequestResult.text = "";
             pmode = "ENCRYPT"; 
             Decrypt.enabled = true;
             Encrypt.enabled = false;
             processData();
            }   

            private function processData():void
            {                                                                                                                                                                                       

             if(pmode == "DECRYPT"){            

              Source.text = "Data to be decrypted";
              Target.text = "Decrypted data";
              Decrypt.enabled = false;
              Encrypt.enabled = true;

              RequestResult.text = ResponseResult.text;
              ResponseResult.text = "";

              // Get the private key from the key file
              var privateRSAKey: RSAKey = PEM.readRSAPrivateKey(myprivkeystr);             

              privateRSAKey.decrypt(encrypteddata, decrypteddata, encrypteddata.length);

              // Convert the decrypted data to its original format
              ResponseResult.text = Hex.toString(Hex.fromArray(decrypteddata)); 

             }  
             else{  
              pmode = "ENCRYPT";                      
              Source.text = "Data to be encrypted";
              Target.text = "Encrypted data";
              Decrypt.enabled = true;
              Encrypt.enabled = false;
              src = new ByteArray;
              decrypteddata = new ByteArray;
              encrypteddata = new ByteArray;  

              var textstr:String = "test data test data test data testing 1234";
              RequestResult.text = textstr;
              ResponseResult.text = "";

              // Get the public key from the certificate file                   
              var x509cert:X509Certificate = new X509Certificate(PEM.readCertIntoArray(myCertstr));
              var publicRSAKey: RSAKey = x509cert.getPublicKey();            

              // Convert the data to ByteArray          
              src = Hex.toArray(Hex.fromString(textstr));

              publicRSAKey.encrypt(src, encrypteddata, src.length); 

              // Covert the encrypted data into Hex format                    
              ResponseResult.text = Hex.fromArray(encrypteddata);           

            }        

            }                                                                                               

        ]]>
    </mx:Script>    

    <mx:Panel id="Title" width="100%" height="60%" horizontalAlign="left" paddingBottom="5"
              paddingLeft="5" paddingRight="5" paddingTop="5" title="Certificate test with RSA">
        <mx:Label id="Source" text="" fontWeight="bold" height="5%"/>
        <mx:TextArea id="RequestResult" text= "" editable="false" width="100%" height="44.5%"/>
        <mx:Label id="Target" text="" fontWeight="bold" height="5%"/>
        <mx:TextArea id="ResponseResult" text="" editable="false" width="100%" height="44.5%"/>     
        <mx:Button id="Decrypt" label="Decrypt Data" width="5%" height="0.5%" click="decryptData()"/>
        <mx:Button id="Encrypt" label="Encrypt Data" width="5%" height="0.5%" click="encryptData()"/>
     </mx:Panel>     

</mx:Application>
timkurvers commented 11 years ago

Sorry for not getting back to you earlier. I'm glad you got it resolved.