1.加密的密匙被别人反编译出来也没关系,甚至可以主动公开.
2.同样的内容,每次加密会生成不同的密文,但都可以用私匙正确解密.
应用场景:
1.服务端与客户端通信,使用http或ws协议,如果是明文协议,普通人可以通过抓包看到明文,如果加密后即使是相同内容也每次密文不一样,不懂得反编译exe的人,没能从源码里找出公匙,就没法破解,不知道通信的明文内容.
2.加大抓包对比难度,因为即使是相同的内容,每次加密生成的密文也不一样,别人没有私匙没法直接解密为明文来对比,只能每次都提交来通过返回的应答来确定是不是加密正确,这就加大了分析表单提交的各项值怎么计算出来的难度和所耗费的时间.
3.适用于不想明文内容被人知道的场景,比如某些偷偷下载安装的见不得光的通信指令,或某些动态加密环节的动态密匙传输不能让别人抓包看到.
4..其它需要明文不变但密文可以有多份的场景.
具体项目:
1.防撞库,用来把用户密码以密文方式保存到数据库,这样别人进了数据库也还原不出密码,知道公匙也很难用撞库的方式把密码撞出来,因为同一个密码有N个正确的密文,没有唯一性就很难遍历出密码原文是什么.
2.数据库各行记录校验防修改,如资金转帐提现等重要记录,为防止别人修改字段值或添加新记录,加一列校验列,把前面各字段加盐后加密成校验值,别人不知道私匙无法伪造或还原分析校验思路.
演示代码:
import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=1056;bottom=754)
winform.add(
["button_加密"]={cls="button";text="加密(使用公钥)";left=193;top=665;right=310;bottom=709;z=15};
["button_解密"]={cls="button";text="解密(使用私钥)";left=737;top=665;right=854;bottom=709;z=16};
["edit_公匙"]={cls="edit";left=26;top=63;right=508;bottom=264;autohscroll=false;edge=1;multiline=1;vscroll=1;z=3};
["edit_密文1"]={cls="edit";left=26;top=497;right=507;bottom=654;autohscroll=false;edge=1;multiline=1;vscroll=1;z=11};
["edit_密文2"]={cls="edit";left=546;top=297;right=1027;bottom=454;autohscroll=false;edge=1;multiline=1;vscroll=1;z=6};
["edit_明文1"]={cls="edit";text="123456 简码编程 www.jianma123.com";left=26;top=297;right=507;bottom=454;autohscroll=false;edge=1;multiline=1;vscroll=1;z=5};
["edit_明文2"]={cls="edit";left=546;top=497;right=1027;bottom=654;autohscroll=false;edge=1;multiline=1;vscroll=1;z=12};
["edit_私匙"]={cls="edit";left=546;top=63;right=1028;bottom=264;autohscroll=false;edge=1;multiline=1;vscroll=1;z=4};
groupbox={cls="groupbox";text="加密";left=14;top=11;right=524;bottom=738;edge=1;z=1};
groupbox2={cls="groupbox";text="解密";left=534;top=11;right=1044;bottom=738;edge=1;z=2};
static={cls="static";text="公匙:(加密用,可公开)";left=26;top=42;right=182;bottom=59;transparent=1;z=7};
static2={cls="static";text="私匙:(解密用,不可公开)";left=546;top=42;right=719;bottom=59;transparent=1;z=8};
static3={cls="static";text="明文:";left=26;top=274;right=74;bottom=291;transparent=1;z=9};
static4={cls="static";text="密文:";left=546;top=274;right=594;bottom=291;transparent=1;z=10};
static5={cls="static";text="明文:";left=546;top=477;right=594;bottom=494;transparent=1;z=13};
static6={cls="static";text="密文:";left=26;top=477;right=74;bottom=494;transparent=1;z=14}
)
/*}}*/
import crypt.rsa;
var rsa = crypt.rsa();
rsa.genKey();
winform.button_加密.oncommand = function(id,event){
//导入公匙
var header = rsa.importPemKey(winform.edit_公匙.text);
if(header){
//winform.msgbox("已导入:" + header);
}else{
winform.msgboxErr("错误的密钥格式");
return ;
}
var 明文 = winform.edit_明文1.text;
var ciphertext = rsa.encryptReverse(明文);//转换
if(ciphertext){
winform.edit_密文1.text = crypt.encodeBin(ciphertext);
winform.edit_密文2.text = crypt.encodeBin(ciphertext);
}else {
winform.msgboxErr("加密失败,请检查是否导入了正确的公钥")
}
}
winform.button_解密.oncommand = function(id,event){
//导入私匙
var header = rsa.importPemKey(winform.edit_私匙.text);
if(header){
//winform.msgbox("已导入:" + header);
}else{
winform.msgboxErr("错误的密钥格式");
return ;
}
var ciphertext = crypt.decodeBin(winform.edit_密文2.text);
if(!ciphertext){
winform.msgboxErr("解密失败,请检查是否输入了base64编码的密文");
return;
}
var plaintext = rsa.decryptReverse(ciphertext);
if(plaintext){
winform.edit_明文2.text = plaintext;
}
else {
winform.msgboxErr("解密失败,请检查是否导入了正确的私钥")
}
}
winform.edit_公匙.text = /*
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAPo9wudnB2WU4SW7a51Ynx2mPtBicRsEQq9roMuypU9PkLK5uzNyZdPy
2eBkb8fm4kyLAI1NgvBPnmjHTYolMuuCGS5+ZaTUg0F33KCVQmMQJg/sjd2mapl3
gL4ged9o3SkKQ3QZm7ZRyYB6TTSqLfuAMpc3lzkZhUv6YUTxdO4pAgMBAAE=
-----END RSA PUBLIC KEY-----
*/
winform.edit_私匙.text = /*
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQD6PcLnZwdllOElu2udWJ8dpj7QYnEbBEKva6DLsqVPT5Cyubsz
cmXT8tngZG/H5uJMiwCNTYLwT55ox02KJTLrghkufmWk1INBd9yglUJjECYP7I3d
pmqZd4C+IHnfaN0pCkN0GZu2UcmAek00qi37gDKXN5c5GYVL+mFE8XTuKQIDAQAB
AoGBAJPB7hjGvBZd/0dRUCy7TFCsfgB7b/+c12dPLMW6OWQIPg9aHdA15yxsA/w8
Mcieatb5aJ0GvJ761DVYIU/FwTclU41Wlwb9ONz7Uhumh63w4lGxIjkp2wKfm50Z
P9LgYzreCRBVOi4wntQL71G3YHLlYnU95S2nN4oAguvH3vHRAkEA/4OYSxw2/lRA
Su52iaYRVuTr7dmNvsmHgibAO6v1+uxUWKAuOFexfDHx81chjvXhiKkRFS5Rchby
5lssy/GodQJBAPq3mWa7sCl5RoSZLNOFsOxv1epywCSR7JHzuzeQlCXMSq+qtNOZ
7n7ADx0+PSL4rvZbeCWb4Vwtr8Ylit+4mGUCQQDQ1oDaGxSDqN7nn6H4/We8qtx+
icsFvffok72YyAMDdLe3vCwq1tn01WmY54VBMIyGwxB4TGQ7KLCdQLYLdtelAkB9
jzcm6PYHPzIes+tsHzcEodl6qW8qoV3dljd7U0+uQkphAVe/5QY4ugyXs5TAj9Rn
klVwWEmbdVHjJOgQtIy1AkAKX8f9xMvde5zYQaT+yOw4rpJOUB+FFGoc+8aHa4Y9
mdCcqmA9x+I6QE5NlUrKPwvCoHf6MypklpW4o+eGDXOT
-----END RSA PRIVATE KEY-----
*/
winform.show();
win.loopMessage();