{"id":92,"date":"2010-08-26T20:49:15","date_gmt":"2010-08-27T01:49:15","guid":{"rendered":"http:\/\/www.danielansari.com\/wordpress\/?p=92"},"modified":"2016-10-10T12:30:05","modified_gmt":"2016-10-10T17:30:05","slug":"decrypting-aes-encrypted-values-from-coldfusion-in-net","status":"publish","type":"post","link":"http:\/\/www.danielansari.com\/wordpress\/2010\/08\/decrypting-aes-encrypted-values-from-coldfusion-in-net\/","title":{"rendered":"Decrypting AES-encrypted values from ColdFusion in .NET"},"content":{"rendered":"<p>I recently needed to achieve interoperability between ColdFusion and .NET in terms of encryption; in this case, consuming a ColdFusion web service in .NET.<\/p>\n<p>I used the Adobe article, <a href=\"http:\/\/kb2.adobe.com\/cps\/546\/e546373d.html\">Strong encryption in ColdFusion MX 7<\/a>, as a resource.<\/p>\n<p>Although the encrypt function takes IVorSalt (initialization vector) as an optional argument, we need to explicitly set this value, as we&#8217;ll be using it in .NET to perform the decryption.<\/p>\n<p>Here is the ColdFusion code to perform the encryption:<\/p>\n<link rel=\"stylesheet\" href=\"http:\/\/www.danielansari.com\/wordpress\/wp-content\/plugins\/codeviewer\/codeviewer.css\" type=\"text\/css\" media=\"all\" \/>\n<ol class=\"codelist\">\n<li value=\"1\" class=\"tab0 odd\"><code><span style=\"color: #333333;\"><span style=\"color: #0000FF;\">&lt;<\/span><span style=\"color: #990000; font-weight: bold;\">cfset<\/span> <span style=\"color: #000000; font-weight: bold;\">var<\/span> key <span style=\"color: #0000FF;\">=<\/span> <span style=\"color: #009900;\">&quot;dVwuCuBX0LIrSYQbG38f9w==&quot;<\/span> <span style=\"color: #0000FF;\">\/&gt;<\/span><\/span><span style=\"color: #808080; font-style: italic;\">&lt;!-- Key in base 64 --&gt;<\/span><\/code><\/li>\n<li value=\"2\" class=\"tab0 even\"><code><span style=\"color: #333333;\"><span style=\"color: #0000FF;\">&lt;<\/span><span style=\"color: #990000; font-weight: bold;\">cfset<\/span> <span style=\"color: #000000; font-weight: bold;\">var<\/span> algorithm <span style=\"color: #0000FF;\">=<\/span> <span style=\"color: #009900;\">&quot;AES\/CBC\/PKCS5Padding&quot;<\/span> <span style=\"color: #0000FF;\">\/&gt;<\/span><\/span><\/code><\/li>\n<li value=\"3\" class=\"tab0 odd\"><code><span style=\"color: #333333;\"><span style=\"color: #0000FF;\">&lt;<\/span><span style=\"color: #990000; font-weight: bold;\">cfset<\/span> <span style=\"color: #000000; font-weight: bold;\">var<\/span> encoding <span style=\"color: #0000FF;\">=<\/span> <span style=\"color: #009900;\">&quot;Base64&quot;<\/span> <span style=\"color: #0000FF;\">\/&gt;<\/span><\/span><\/code><\/li>\n<li value=\"4\" class=\"tab0 even\"><code><span style=\"color: #333333;\"><span style=\"color: #0000FF;\">&lt;<\/span><span style=\"color: #990000; font-weight: bold;\">cfset<\/span> <span style=\"color: #000000; font-weight: bold;\">var<\/span> IV <span style=\"color: #0000FF;\">=<\/span> <span style=\"color: #0000FF;\">BinaryDecode<\/span><span style=\"color: #0000FF;\">&#40;<\/span><span style=\"color: #009900;\">&quot;7fe8585328e9ac7b28e9ac7b748209b0&quot;<\/span>, <span style=\"color: #009900;\">&quot;hex&quot;<\/span><span style=\"color: #0000FF;\">&#41;<\/span> <span style=\"color: #0000FF;\">\/&gt;<\/span><\/span><span style=\"color: #808080; font-style: italic;\">&lt;!-- Initialization Vector in hexadecimal --&gt;<\/span><\/code><\/li>\n<li value=\"5\" class=\"tab0 odd\"><code><span style=\"color: #333333;\"><span style=\"color: #0000FF;\">&lt;<\/span><span style=\"color: #990000; font-weight: bold;\">cfset<\/span> <span style=\"color: #0000FF;\">password<\/span> <span style=\"color: #0000FF;\">=<\/span> <span style=\"color: #0000FF;\">encrypt<\/span><span style=\"color: #0000FF;\">&#40;<\/span><span style=\"color: #0000FF;\">password<\/span>, key, algorithm, encoding, IV<span style=\"color: #0000FF;\">&#41;<\/span> <span style=\"color: #0000FF;\">\/&gt;<\/span><\/span><\/code><\/li>\n<li value=\"6\" class=\"tab0 even\"><code><span style=\"color: #333333;\"><span style=\"color: #0000FF;\">&lt;<\/span><span style=\"color: #990000; font-weight: bold;\">cfreturn<\/span> <span style=\"color: #0000FF;\">password<\/span> <span style=\"color: #0000FF;\">\/&gt;<\/span><\/span><\/code><\/li>\n<\/ol>\n<p>And here is the VB.NET code to perform the decryption:<\/p>\n<link rel=\"stylesheet\" href=\"http:\/\/www.danielansari.com\/wordpress\/wp-content\/plugins\/codeviewer\/codeviewer.css\" type=\"text\/css\" media=\"all\" \/>\n<ol class=\"codelist\">\n<li value=\"1\" class=\"tab0 odd\"><code><span style=\"color: #0600FF;\">Dim<\/span> key<span style=\"color: #000000;\">&#40;<\/span><span style=\"color: #000000;\">&#41;<\/span> <span style=\"color: #FF8000;\">As<\/span> <span style=\"color: #FF0000;\">Byte<\/span> <span style=\"color: #008000;\">=<\/span> Convert.<span style=\"color: #0000FF;\">FromBase64String<\/span><span style=\"color: #000000;\">&#40;<\/span><span style=\"color: #808080;\">&quot;dVwuCuBX0LIrSYQbG38f9w==&quot;<\/span><span style=\"color: #000000;\">&#41;<\/span><\/code><\/li>\n<li value=\"2\" class=\"tab0 even\"><code><span style=\"color: #0600FF;\">Dim<\/span> iv<span style=\"color: #000000;\">&#40;<\/span><span style=\"color: #000000;\">&#41;<\/span> <span style=\"color: #FF8000;\">As<\/span> <span style=\"color: #FF0000;\">Byte<\/span> <span style=\"color: #008000;\">=<\/span> <span style=\"color: #FF8000;\">New<\/span> <span style=\"color: #FF0000;\">Byte<\/span><span style=\"color: #000000;\">&#40;<\/span><span style=\"color: #000000;\">&#41;<\/span> <span style=\"color: #000000;\">&#123;<\/span><span style=\"color: #008000;\">&amp;<\/span>H7F, <span style=\"color: #008000;\">&amp;<\/span>HE8, <span style=\"color: #008000;\">&amp;<\/span>H58, <span style=\"color: #008000;\">&amp;<\/span>H53, <span style=\"color: #008000;\">&amp;<\/span>H28, <span style=\"color: #008000;\">&amp;<\/span>HE9, <span style=\"color: #008000;\">&amp;<\/span>HAC, <span style=\"color: #008000;\">&amp;<\/span>H7B, <span style=\"color: #008000;\">&amp;<\/span>H28, <span style=\"color: #008000;\">&amp;<\/span>HE9, <span style=\"color: #008000;\">&amp;<\/span>HAC, <span style=\"color: #008000;\">&amp;<\/span>H7B, <span style=\"color: #008000;\">&amp;<\/span>H74, <span style=\"color: #008000;\">&amp;<\/span>H82, <span style=\"color: #008000;\">&amp;<\/span>H9, <span style=\"color: #008000;\">&amp;<\/span>HB0<span style=\"color: #000000;\">&#125;<\/span><\/code><\/li>\n<li value=\"3\" class=\"odd\">&nbsp;<\/li>\n<li value=\"4\" class=\"tab0 even\"><code><span style=\"color: #0600FF;\">Dim<\/span> password <span style=\"color: #FF8000;\">As<\/span> <span style=\"color: #FF8000;\">String<\/span> <span style=\"color: #008000;\">=<\/span> DecryptAES<span style=\"color: #000000;\">&#40;<\/span>encryptedPassword, key, iv<span style=\"color: #000000;\">&#41;<\/span><\/code><\/li>\n<li value=\"5\" class=\"odd\">&nbsp;<\/li>\n<li value=\"6\" class=\"tab0 even\"><code><span style=\"color: #FF8000;\">Private<\/span> <span style=\"color: #0600FF;\">Function<\/span> DecryptAES<span style=\"color: #000000;\">&#40;<\/span><span style=\"color: #FF8000;\">ByVal<\/span> cipherText <span style=\"color: #FF8000;\">As<\/span> <span style=\"color: #FF8000;\">String<\/span>, <span style=\"color: #FF8000;\">ByVal<\/span> key<span style=\"color: #000000;\">&#40;<\/span><span style=\"color: #000000;\">&#41;<\/span> <span style=\"color: #FF8000;\">As<\/span> <span style=\"color: #FF0000;\">Byte<\/span>, <span style=\"color: #FF8000;\">ByVal<\/span> iv<span style=\"color: #000000;\">&#40;<\/span><span style=\"color: #000000;\">&#41;<\/span> <span style=\"color: #FF8000;\">As<\/span> <span style=\"color: #FF0000;\">Byte<\/span><span style=\"color: #000000;\">&#41;<\/span> <span style=\"color: #FF8000;\">As<\/span> <span style=\"color: #FF8000;\">String<\/span><\/code><\/li>\n<li value=\"7\" class=\"tab1 odd\"><code><span style=\"color: #0600FF;\">Dim<\/span> cipherBytes<span style=\"color: #000000;\">&#40;<\/span><span style=\"color: #000000;\">&#41;<\/span> <span style=\"color: #FF8000;\">As<\/span> <span style=\"color: #FF0000;\">Byte<\/span> <span style=\"color: #008000;\">=<\/span> Convert.<span style=\"color: #0000FF;\">FromBase64String<\/span><span style=\"color: #000000;\">&#40;<\/span>cipherText<span style=\"color: #000000;\">&#41;<\/span><\/code><\/li>\n<li value=\"8\" class=\"tab1 even\"><code><span style=\"color: #0600FF;\">Dim<\/span> ms <span style=\"color: #FF8000;\">As<\/span> MemoryStream <span style=\"color: #008000;\">=<\/span> <span style=\"color: #FF8000;\">New<\/span> MemoryStream<span style=\"color: #000000;\">&#40;<\/span><span style=\"color: #000000;\">&#41;<\/span><\/code><\/li>\n<li value=\"9\" class=\"tab1 odd\"><code><span style=\"color: #0600FF;\">Dim<\/span> alg <span style=\"color: #FF8000;\">As<\/span> Rijndael <span style=\"color: #008000;\">=<\/span> Rijndael.<span style=\"color: #0000FF;\">Create<\/span><span style=\"color: #000000;\">&#40;<\/span><span style=\"color: #000000;\">&#41;<\/span><\/code><\/li>\n<li value=\"10\" class=\"tab1 even\"><code>alg.<span style=\"color: #0000FF;\">Key<\/span> <span style=\"color: #008000;\">=<\/span> key<\/code><\/li>\n<li value=\"11\" class=\"tab1 odd\"><code>alg.<span style=\"color: #0000FF;\">IV<\/span> <span style=\"color: #008000;\">=<\/span> iv<\/code><\/li>\n<li value=\"12\" class=\"tab1 even\"><code><span style=\"color: #0600FF;\">Dim<\/span> cs <span style=\"color: #FF8000;\">As<\/span> CryptoStream <span style=\"color: #008000;\">=<\/span> <span style=\"color: #FF8000;\">New<\/span> CryptoStream<span style=\"color: #000000;\">&#40;<\/span>ms, alg.<span style=\"color: #0000FF;\">CreateDecryptor<\/span><span style=\"color: #000000;\">&#40;<\/span><span style=\"color: #000000;\">&#41;<\/span>, CryptoStreamMode.<span style=\"color: #0600FF;\">Write<\/span><span style=\"color: #000000;\">&#41;<\/span><\/code><\/li>\n<li value=\"13\" class=\"tab1 odd\"><code>cs.<span style=\"color: #0600FF;\">Write<\/span><span style=\"color: #000000;\">&#40;<\/span>cipherBytes, <span style=\"color: #FF0000;\">0<\/span>, cipherBytes.<span style=\"color: #0000FF;\">Length<\/span><span style=\"color: #000000;\">&#41;<\/span><\/code><\/li>\n<li value=\"14\" class=\"tab1 even\"><code>cs.<span style=\"color: #0600FF;\">Close<\/span><span style=\"color: #000000;\">&#40;<\/span><span style=\"color: #000000;\">&#41;<\/span><\/code><\/li>\n<li value=\"15\" class=\"tab1 odd\"><code><span style=\"color: #0600FF;\">Dim<\/span> decryptedData<span style=\"color: #000000;\">&#40;<\/span><span style=\"color: #000000;\">&#41;<\/span> <span style=\"color: #FF8000;\">As<\/span> <span style=\"color: #FF0000;\">Byte<\/span> <span style=\"color: #008000;\">=<\/span> ms.<span style=\"color: #0000FF;\">ToArray<\/span><span style=\"color: #000000;\">&#40;<\/span><span style=\"color: #000000;\">&#41;<\/span><\/code><\/li>\n<li value=\"16\" class=\"tab1 even\"><code><span style=\"color: #0600FF;\">Dim<\/span> decryptedText <span style=\"color: #FF8000;\">As<\/span> <span style=\"color: #FF8000;\">String<\/span> <span style=\"color: #008000;\">=<\/span> System.<span style=\"color: #0000FF;\">Text<\/span>.<span style=\"color: #0000FF;\">ASCIIEncoding<\/span>.<span style=\"color: #0000FF;\">ASCII<\/span>.<span style=\"color: #0000FF;\">GetString<\/span><span style=\"color: #000000;\">&#40;<\/span>decryptedData<span style=\"color: #000000;\">&#41;<\/span><\/code><\/li>\n<li value=\"17\" class=\"tab1 odd\"><code><span style=\"color: #FF8000;\">Return<\/span> decryptedText<\/code><\/li>\n<li value=\"18\" class=\"tab0 even\"><code><span style=\"color: #0600FF;\">End<\/span> <span style=\"color: #0600FF;\">Function<\/span><\/code><\/li>\n<\/ol>\n<p>Just for reference, the corresponding encrypt function in .NET is provided below.<\/p>\n<link rel=\"stylesheet\" href=\"http:\/\/www.danielansari.com\/wordpress\/wp-content\/plugins\/codeviewer\/codeviewer.css\" type=\"text\/css\" media=\"all\" \/>\n<ol class=\"codelist\">\n<li value=\"20\" class=\"tab0 even\"><code><span style=\"color: #FF8000;\">Private<\/span> <span style=\"color: #0600FF;\">Function<\/span> EncryptAES<span style=\"color: #000000;\">&#40;<\/span><span style=\"color: #FF8000;\">ByVal<\/span> clearText <span style=\"color: #FF8000;\">As<\/span> <span style=\"color: #FF8000;\">String<\/span>, <span style=\"color: #FF8000;\">ByVal<\/span> key<span style=\"color: #000000;\">&#40;<\/span><span style=\"color: #000000;\">&#41;<\/span> <span style=\"color: #FF8000;\">As<\/span> <span style=\"color: #FF0000;\">Byte<\/span>, <span style=\"color: #FF8000;\">ByVal<\/span> iv<span style=\"color: #000000;\">&#40;<\/span><span style=\"color: #000000;\">&#41;<\/span> <span style=\"color: #FF8000;\">As<\/span> <span style=\"color: #FF0000;\">Byte<\/span><span style=\"color: #000000;\">&#41;<\/span> <span style=\"color: #FF8000;\">As<\/span> <span style=\"color: #FF8000;\">String<\/span><\/code><\/li>\n<li value=\"21\" class=\"tab1 odd\"><code><span style=\"color: #0600FF;\">Dim<\/span> clearBytes<span style=\"color: #000000;\">&#40;<\/span><span style=\"color: #000000;\">&#41;<\/span> <span style=\"color: #FF8000;\">As<\/span> <span style=\"color: #FF0000;\">Byte<\/span> <span style=\"color: #008000;\">=<\/span> System.<span style=\"color: #0000FF;\">Text<\/span>.<span style=\"color: #0000FF;\">Encoding<\/span>.<span style=\"color: #0600FF;\">Unicode<\/span>.<span style=\"color: #0000FF;\">GetBytes<\/span><span style=\"color: #000000;\">&#40;<\/span>clearText<span style=\"color: #000000;\">&#41;<\/span><\/code><\/li>\n<li value=\"22\" class=\"tab1 even\"><code><span style=\"color: #0600FF;\">Dim<\/span> ms <span style=\"color: #FF8000;\">As<\/span> MemoryStream <span style=\"color: #008000;\">=<\/span> <span style=\"color: #FF8000;\">New<\/span> MemoryStream<span style=\"color: #000000;\">&#40;<\/span><span style=\"color: #000000;\">&#41;<\/span><\/code><\/li>\n<li value=\"23\" class=\"tab1 odd\"><code><span style=\"color: #0600FF;\">Dim<\/span> alg <span style=\"color: #FF8000;\">As<\/span> Rijndael <span style=\"color: #008000;\">=<\/span> Rijndael.<span style=\"color: #0000FF;\">Create<\/span><span style=\"color: #000000;\">&#40;<\/span><span style=\"color: #000000;\">&#41;<\/span><\/code><\/li>\n<li value=\"24\" class=\"tab1 even\"><code>alg.<span style=\"color: #0000FF;\">Key<\/span> <span style=\"color: #008000;\">=<\/span> key<\/code><\/li>\n<li value=\"25\" class=\"tab1 odd\"><code>alg.<span style=\"color: #0000FF;\">IV<\/span> <span style=\"color: #008000;\">=<\/span> iv<\/code><\/li>\n<li value=\"26\" class=\"tab1 even\"><code><span style=\"color: #0600FF;\">Dim<\/span> cs <span style=\"color: #FF8000;\">As<\/span> CryptoStream <span style=\"color: #008000;\">=<\/span> <span style=\"color: #FF8000;\">New<\/span> CryptoStream<span style=\"color: #000000;\">&#40;<\/span>ms, alg.<span style=\"color: #0000FF;\">CreateEncryptor<\/span><span style=\"color: #000000;\">&#40;<\/span><span style=\"color: #000000;\">&#41;<\/span>, CryptoStreamMode.<span style=\"color: #0600FF;\">Write<\/span><span style=\"color: #000000;\">&#41;<\/span><\/code><\/li>\n<li value=\"27\" class=\"tab1 odd\"><code>cs.<span style=\"color: #0600FF;\">Write<\/span><span style=\"color: #000000;\">&#40;<\/span>clearBytes, <span style=\"color: #FF0000;\">0<\/span>, clearBytes.<span style=\"color: #0000FF;\">Length<\/span><span style=\"color: #000000;\">&#41;<\/span><\/code><\/li>\n<li value=\"28\" class=\"tab1 even\"><code>cs.<span style=\"color: #0600FF;\">Close<\/span><span style=\"color: #000000;\">&#40;<\/span><span style=\"color: #000000;\">&#41;<\/span><\/code><\/li>\n<li value=\"29\" class=\"tab1 odd\"><code><span style=\"color: #0600FF;\">Dim<\/span> encryptedData<span style=\"color: #000000;\">&#40;<\/span><span style=\"color: #000000;\">&#41;<\/span> <span style=\"color: #FF8000;\">As<\/span> <span style=\"color: #FF0000;\">Byte<\/span> <span style=\"color: #008000;\">=<\/span> ms.<span style=\"color: #0000FF;\">ToArray<\/span><span style=\"color: #000000;\">&#40;<\/span><span style=\"color: #000000;\">&#41;<\/span><\/code><\/li>\n<li value=\"30\" class=\"tab1 even\"><code><span style=\"color: #0600FF;\">Dim<\/span> encryptedText <span style=\"color: #FF8000;\">As<\/span> <span style=\"color: #FF8000;\">String<\/span> <span style=\"color: #008000;\">=<\/span> Convert.<span style=\"color: #0000FF;\">ToBase64String<\/span><span style=\"color: #000000;\">&#40;<\/span>encryptedData<span style=\"color: #000000;\">&#41;<\/span><\/code><\/li>\n<li value=\"31\" class=\"tab1 odd\"><code><span style=\"color: #FF8000;\">Return<\/span> encryptedText<\/code><\/li>\n<li value=\"32\" class=\"tab0 even\"><code><span style=\"color: #0600FF;\">End<\/span> <span style=\"color: #0600FF;\">Function<\/span><\/code><\/li>\n<\/ol>\n<p>In .NET, CipherMode.CBC is the default setting for the Mode (termed Feedback Mode in ColdFusion) property of the Rijndael object, and PaddingMode.PKCS7 is the default Padding value.\u00a0 Fortunately, PKCS7 is an extension of the PKCS5 padding scheme, so we are able to decipher the ColdFusion-encrypted value in .NET.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I recently needed to achieve interoperability between ColdFusion and .NET in terms of encryption; in this case, consuming a ColdFusion web service in .NET. I used the Adobe article, Strong encryption in ColdFusion MX 7, as a resource. Although the encrypt function takes IVorSalt (initialization vector) as an optional argument, we need to explicitly set [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[24,23,22],"tags":[29,25,28,30],"_links":{"self":[{"href":"http:\/\/www.danielansari.com\/wordpress\/wp-json\/wp\/v2\/posts\/92"}],"collection":[{"href":"http:\/\/www.danielansari.com\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.danielansari.com\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.danielansari.com\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.danielansari.com\/wordpress\/wp-json\/wp\/v2\/comments?post=92"}],"version-history":[{"count":12,"href":"http:\/\/www.danielansari.com\/wordpress\/wp-json\/wp\/v2\/posts\/92\/revisions"}],"predecessor-version":[{"id":106,"href":"http:\/\/www.danielansari.com\/wordpress\/wp-json\/wp\/v2\/posts\/92\/revisions\/106"}],"wp:attachment":[{"href":"http:\/\/www.danielansari.com\/wordpress\/wp-json\/wp\/v2\/media?parent=92"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.danielansari.com\/wordpress\/wp-json\/wp\/v2\/categories?post=92"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.danielansari.com\/wordpress\/wp-json\/wp\/v2\/tags?post=92"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}