aardio封装库) aes和des加解密

前言

昨天那篇文章封装了微软的js引擎,文章里说可以用crypt-js来实现一些常用的加解密算法,但是如果我只是需要使用aes这个算法,确要加载一个js引擎。

这样属实有点累赘了,而且浪费资源。所以这篇文章来写一个C语言实现的AES和DES算法,然后编译成dll封装成库。c语言编译成dll具体我就不说了。

只需要github搜一下aes和des再筛选C/C++,然后增加导出几个函数编译成dll。

下载

库的下载可以看之前的那篇文章aardio教程) 搭建自己的扩展库仓库

仓库链接:https://github.com/kanadeblisst00/aardio-extlibs

使用

aes base64

使用方式很简单,核心就两行代码

// 第一个参数是key,第二个是iv
// 如果是ecb模式,iv可以不传
var aesObj = kicrypt.aes("1234567890abcdef""1234567890abcdef");
// 第一个参数是需要解密的文本
// 第二个是aes加密的模式,这里实现了ECB/CBC/CFB三种
// 第三个是aes填充的模式,这里实现了Pkcs7Padding/ZeroPadding/NoPadding三种
var result = aesObj.decrypt(text, kicrypt.aes.CBC,kicrypt.aes.Pkcs7Padding);

完整代码:

import console
import kicrypt.aes;
import crypt.bin;

demo_base64 = function(){
 var t0 = time.tick();
 var text = "hKR6aJIwgnmRUzq9e/a79JavYtmchrGHTiRpwVB0A/RI0orBc7UrrYvmq46c1ZP7tozyjO4Y2ZHl1Bt5JG/99GDa7Ui9Z37nuxTovUKYLCN6prkaYW8xN2JRXKV5ir4KW4Mh7lLht68g/D9JkZsjJaiNqjfy4R9Lnw+PCXJrMQ4SSVmD4vW8DF1/leZhUu6L/80XTR3SbWTrEFRcFYTc84NdrH5AeKxZokt0zJZDzk+DG5QGSbScmihTCQXa3t5tUrYWnqSOKfCYsfwhG3QTSqTSAmtQ149UtMmor6x2QRE5T4pl6cWsX1hAqboD691SCBnE1eTiHk0LfAoyheC1Q2gX7qxLbjMb1wHxYWCqx2Rx8J2TiFaBhlVgnhi3MeqKUWKg7LPACetYg762k1uhlm7ZYbbQ7x8c/ogoI+ClB/IQTu85xv4T+u7l1pRYNJa+Fd4U346TZR7o9DweaJjX0PV72nHNjPenRNX8ew66SRcd6BDNT5M74Avcy7RJ0fhZksDVtSk/xd3xH0J5ZLY8TPwtxXl0tS0nbRinQbX0nNS7NsOH+PC4rm9x5r+C6rmSaAHur+i9fWfYibD7cZhRkivuaEAyFXdHoWsBJYcXspk+JOQ7QR+focsClLSWNyLQUb6uSoaaDCos9y4/+9x3RNz/R2r80wJPhJrbHxm8k7xPA9dFfWSgRSTd3KD0aYigfwCovjKRpuew+KgBaTrzhA=="
    var l = crypt.bin.decodeBase64(text);
    var aesObj = kicrypt.aes("1234567890abcdef""1234567890abcdef");
    var result = aesObj.decrypt(l, kicrypt.aes.CBC,kicrypt.aes.Pkcs7Padding);
    console.log("base64解密完成,花费时间: ", time.tick()-t0);
    console.log("basse64解密结果, str: ", result);
    
    var result = aesObj.encrypt(result,kicrypt.aes.CBC,kicrypt.aes.Pkcs7Padding);
    var b64Result = crypt.bin.encodeBase64(result);
    console.log("basse64加密完成,花费时间: ", time.tick()-t0);
    console.log("basse64加密结果, str: ", b64Result);
}
demo_base64()
console.pause(true);
aardio封装库) aes和des加解密

aes hex

import console
import kicrypt.aes;

demo_hex = function(){
 var t0 = time.tick();
 var text = "84A47A689230827991533ABD7BF6BBF496AF62D99C86B1874E2469C1507403F448D28AC173B52BAD8BE6AB8E9CD593FBB68CF28CEE18D991E5D41B79246FFDF460DAED48BD677EE7BB14E8BD42982C237AA6B91A616F313762515CA5798ABE0A5B8321EE52E1B7AF20FC3F49919B2325A88DAA37F2E11F4B9F0F8F09726B310E12495983E2F5BC0C5D7F95E66152EE8BFFCD174D1DD26D64EB10545C1584DCF3835DAC7E4078AC59A24B74CC9643CE4F831B940649B49C9A28530905DADEDE6D52B6169EA48E29F098B1FC211B74134AA4D2026B50D78F54B4C9A8AFAC764111394F8A65E9C5AC5F5840A9BA03EBDD520819C4D5E4E21E4D0B7C0A3285E0B5436817EEAC4B6E331BD701F16160AAC76471F09D938856818655609E18B731EA8A5162A0ECB3C009EB5883BEB6935BA1966ED961B6D0EF1F1CFE882823E0A507F2104EEF39C6FE13FAEEE5D694583496BE15DE14DF8E93651EE8F43C1E6898D7D0F57BDA71CD8CF7A744D5FC7B0EBA49171DE810CD4F933BE00BDCCBB449D1F85992C0D5B5293FC5DDF11F427964B63C4CFC2DC57974B52D276D18A741B5F49CD4BB36C387F8F0B8AE6F71E6BF82EAB9926801EEAFE8BD7D67D889B0FB719851922BEE684032157747A16B01258717B2993E24E43B411F9FA1CB0294B4963722D051BEAE4A869A0C2A2CF72E3FFBDC7744DCFF476AFCD3024F849ADB1F19BC93BC4F03D7457D64A04524DDDCA0F46988A07F00A8BE3291A6E7B0F8A801693AF384"
    var l = string.unhex(text,"");
    var aesObj = kicrypt.aes("1234567890abcdef""1234567890abcdef");
    var result = aesObj.decrypt(l, kicrypt.aes.CBC,kicrypt.aes.Pkcs7Padding);
    console.log("hex解密完成,花费时间: ", time.tick()-t0);
    console.log("hex解密结果, str: ", result);
    
    var result = aesObj.encrypt(result,kicrypt.aes.CBC,kicrypt.aes.Pkcs7Padding);
    var b64Result = string.hex(result,"");
    console.log("hex加密完成,花费时间: ", time.tick()-t0);
    console.log("hex加密结果, str: ", b64Result);
}
demo_hex()
console.pause(true);
aardio封装库) aes和des加解密

des

des实现和aes差不多,不过我只实现了CBC和ECB两种模式,并且填充模式默认pkcs7,无法修改。这个代码是几年前写的,估计是当时找的c语言库不支持其他填充模式

des的key和iv都是8位

import console
import kicrypt.des;
import crypt.bin;

demo_base64 = function(){
 var t0 = time.tick();
 var text = "NFLYMso61GY=";
 var l = crypt.bin.decodeBase64(text);
    // 如果是ecb模式,iv可以不传
    var desObj = kicrypt.des("12345678""12345678");
    var result = desObj.decrypt(l, kicrypt.des.DES_CBC);
    console.log("base64解密完成,花费时间: ", time.tick()-t0);
    console.log("basse64解密结果, str: ", result);
    
    var result = desObj.encrypt(result,kicrypt.des.DES_CBC);
    var b64Result = crypt.bin.encodeBase64(result);
    console.log("basse64加密完成,花费时间: ", time.tick()-t0);
    console.log("basse64加密结果, str: ", b64Result);
}

demo_base64()
console.pause(true);

3des

3des的key可以是8位/16位/24位,iv固定8位

import console
import kicrypt.des;
import crypt.bin;

demo_3des = function(){
 var t0 = time.tick();
 var desObj = kicrypt.des("app^hbrb:321#@!ewq&^*bnm");
 var text = "wThM8m7Rb73+fLHtjdhm4bX/f3UScRvJG1WZT5f+V3yqH6JO2SY5PawTh9dkK7P+fGAPjN31GOkt83n7n8H3ZTIXODkFg0hcpoe3+Lcx0F0FwZckUOwMmMNjZVPMwhgOFG1WxIwFjxiKTbeLY4nlnOYIggJPM6w/2BHxX+c/0GQIQJLIiRUi/cZvW2V7v1LryJ+I2RWYjC4aQBXl840wuNkTEogV7DlJMhc4OQWDSFyiPsSO9ox9CwkkouUErIWUw2NlU8zCGA6lKyHPkeegOPcHWdhgFYiQG8m40PzGJirL646e6p1wxLv2c9lM3F2NkNEfo/ynfoMFklFH9owcwbibpWoxSMEfuZd03SgWQz7xOWrcdgOOuXxPCVzNmWxv51HJCMK4y2oy5EBEEebYcEdPxMesJa3m2/Z1Qed5PePvm+AKWa8gHn/Z29oexMTguZd03SgWQz63002LdzEd+YmXF3oUJNO9RAuPuBpimJeCZ8YF9BEl9bmXdN0oFkM+FVjSGfdYzR5ygLRpxzD+EKL66AAUQigLGkAV5fONMLisH3+jRUYOsTIXODkFg0hc5LIi1X0XPB0JJKLlBKyFlMNjZVPMwhgOW2v1I6msBbGH/QU5z9XCExvJuND8xiYqy+uOnuqdcMTDjjD9uJDyFC4XCjk7jpGAB/C/00LipM/peJGCZWIDIFOM8FxyaqTK/WUww8MUxKJuU+ArSA2nTNHs5jTkllSAXdrSTuUC1GKUNUx9s08UJ1tr9SOprAWx+9uC+Trc4rwbybjQ/MYmKsvrjp7qnXDEvemZdCzIVFOGB9c9PdnkemuWl9TePHnQ6XiRgmViAyASpuNseWkwxjIXODkFg0hcoDGDSX87N/kJJKLlBKyFlMNjZVPMwhgOiVqrity58bqjCCY7B1XGy4Cn+4N2ubYGuZd03SgWQz51KnXNDCBbFox3KpcXcm4Zi7pMM/Fz3PVd2tJO5QLUYpQ1TH2zTxQnK7F4og5PiLxl4NaW2RwcdRvJuND8xiYq6Gsu4///yjTxVMJTm80wllfhiwOXmZBWs4nkzACZOQC34o1Bmi5K/POjpyRTRCQglDVMfbNPFCf9ZTDDwxTEoiBxehWVHgdsQ5PKwBriBg49u8x9/l+dwhTP9MS7HyF5kXYSp45EBef9ZTDDwxTEosoBv2OqbBz8Q5PKwBriBg49u8x9/l+dwhTP9MS7HyF5c7SOW/FJoPKfBHYcIMzSxn3XvwjZMr/7G8m40PzGJipz5LisfE+2lDTXnTkk0dSxrUObkwjF7yb9ZTDDwxTEoifNMMOUQ1huMuRARBHm2HA9u8x9/l+dwppv4Fu11JrC2RMSiBXsOUkyFzg5BYNIXKI+xI72jH0LNPXTeVnXdr4OSPMnWqNMRHEkpkIF9MR4wFfIn+Pvr4aMdyqXF3JuGadIJY0zfDhyaueBopus8QO+71Wys8vVO39+iwD9wiotoKtyYTn987QyFzg5BYNIXC2sqe38wBeNj8y7N/k/rRZn8RzHuJU103SunyzH15TiDayAqZrG6mg3prdXHYD5yAi/ICkaO747ZP1QL/0Tc8E09dN5Wdd2vg5I8ydao0xEo85SEKi90C4CvANV0MuhPjIXODkFg0hcbyyDryAsRbk09dN5Wdd2vg5I8ydao0xEMRvaQA2kD6Ctr1cWPBA0adGfVsQz+Ii4swH2PzdoOm2ODmV5ObC0gN7sInnJb3pUyn9XXgmmX3sGHI0NV7b0tmo/orNIW45TpA3wOgdJYFX+6u4i6ztAo1Z9UoYnrOy//XI6yCR03AtHT8THrCWt5sK3OdBdotmjbxNZlap/8aLtIYN+7jCmE4QtdPUgX4RyF4AWP4Cpr0nDY2VTzMIYDltr9SOprAWxh/0FOc/VwhMbybjQ/MYmKgjVkD0kEYklPZZaoD1HmHDDY2VTzMIYDvLBJM046mc63udVKMFyiILiSOcPLp50+4QtdPUgX4RylosjALMIhAlHT8THrCWt5qUb2Tsa26oX3//n2QGKZEB7HnnQqR
Qm97x
UcrtXF0A2hC109SBfhHKcfQxT2gKgAUdPxMesJa3m6F/q0KDU2sd+GdrfHGKGG9mNmMTzot2jVn1Shies7L9wnn/bdPzHFKRQ2k6Arez0vemZdCzIVFOGB9c9PdnkemuWl9TePHnQ3uwieclvelTKf1deCaZfe2Rdduqzv/xEZmY5oVlAT7J8TwlczZlsb+9rlc9vdEpZZ/Ecx7iVNdN0rp8sx9eU4hQFjoDwjqg0Dm3B+bDG+JkyFzg5BYNIXHUbL+zEeBRONPXTeVnXdr4OSPMnWqNMRG/r/84mQB6SxLx5dM26Ywv9ZTDDwxTEoiWwFYmHceRpMuRARBHm2HA9u8x9/l+dwvGTUPnA2It2lDVMfbNPFCcrsXiiDk+IvGXg1pbZHBx1G8m40PzGJioI1ZA9JBGJJRjWEy5BBUPlC+XjCJRWs5E="

    var l = crypt.bin.decodeBase64(text);
    var result = desObj.decrypt(l, kicrypt.des.DES3_ECB);
    console.log("demo_3des解密完成,时间:", time.tick()-t0)
    console.log("demo_3des解密结果, str: ", result);
}

demo_3des()
console.pause(true);

总结

可以看到使用c语言实现的aes和des加解密速度很快,如果加载js引擎来实现,估计得慢好几倍,占用的资源也得几十倍。

下一篇文章说一下js引擎的实战使用:逆向有道翻译实现调用翻译API。有道翻译的加密非常简单,没有复杂的补环境操作,很适合用来测试js引擎。


原文始发于微信公众号(Python成长路):aardio封装库) aes和des加解密

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/286995.html

(0)
土豆大侠的头像土豆大侠

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!