今天,我们大多数人在网上购物,我们使用网上银行或手机银行支付所有的商品和服务,但要完成交易,需要从提供网上银行的OTP(一次性密码)。在方便的时候,我们忘记了包含OTP的短信是通过服务提供商发送的,将机密数据泄露给未经授权的人(服务提供商公司的第三方)。同样的事情也会发生在当某一金额被借记或贷记到你的账户上时,带有当前余额信息的最后一笔交易的细节将会是通过GSM和arduino发送给您.假定读者已完成该项目如何开始使用Arduino和如何将lcd与Arduino接口..
在以下项目中:DENcryptor我们提出并实现了一种方法,使用AES和解密从您的银行向您发送您的帐户凭据,以获得安全的详细信息.
DENcryptor这个词是一个游戏扩散系数-密码和EN-加密机。
图1:基于Arduino的DENcryptor安全消息实现的原型
所需硬件组件:
1.阿杜伊诺·乌诺/Freeduino / tiny / MSP430 /兼容微控制器板
图2:Arduino Board图片
2.GSM调制解调器(SIM 900/SIM 300)
图3:SIM900 GSM Modem图像
3.适配器5v - 2A(兼容GSM modem)
图4:16X2字符LCD背面图像
5.USB电缆类型A至类型B,跨接导线
图5:图像显示跳线连接字符LCD
加密
加密的基本思想:
加密是一种对未经授权的个人隐藏信息的技术,有很多加密信息的方法,其中的科学称为密码学。
在日常生活中,我们在上网查阅邮件、查看银行凭证、甚至在Facebook上与某人聊天时,都在不知不觉中使用了加密技术。加密的行为是隐藏的,但对于保护你的隐私不被黑客盯上是非常重要的。
AES是数字世界中最流行和被广泛接受的加密方案之一。使用此加密SMS数据创建了一个非常高的安全性和简单性层。
方框图:
传输结束(银行)
如图所示,它利用客户数据库来使用密钥,并对凭证(如余额声明或otp)进行加密,然后通过GSM Modem发送
图6:基于Arduino的AES加密和AES解密设备的框图
接收端(用户)
实施启动:
在开始编写代码将Arduino连接到GSM或LCD之前,我们需要设置一种基本的加密方法。为了获得AES密码文本,DENcryptor使用了C语言中的一个标准库,该库在线提供(也作为邮件附件提供),尽管该库的编写考虑到了德州仪器MSP430微控制器,但它与其他微控制器的配合也非常好。金博宝188BET下载
装电线:
以下电路使用4位模式的16×2液晶显示器有效利用Freeduino上的大头针。与GSM板的通信是使用软件串行引脚完成的,在这种情况下是引脚11和10,详细的接线如下所示。
算法:
GSM调制解调器和Arduino之间的通信使用AT(注意电话)命令完成。使用的各种命令如下:,
在命令 |
参数/功能 |
回答 |
在 |
– |
好吧 |
AT+IPR=? |
AT+IPR=9600或+知识产权= 4800 |
给出/设置支持的波特率 |
AT+CMGF=1 |
设置调制解调器为文本模式 |
好吧 |
+ CNMI = 2 2 0, 0, 0 |
设置新的消息指示模式,Unsolicited, Detailed等。 |
好吧 |
在+ CSMP = 17167, 0,0 |
集合编码方法 |
好吧 |
AT+CSCS=“IRA” |
设置字符模式为ASCII |
好吧 |
AT+CSCS=“GSM” |
设置发送信息回调制解调器的模式 |
好吧 |
AT+CSCS=“UCS2” |
将文本编码设置为Unicode |
好吧 |
+ CMGR = 1 |
阅读最后收到或存储的短信 |
显示短信 |
注意:默认情况下,与GSM调制解调器的通信波特率为115200,但调制解调器波特率可以降低到9600,这就足够了,并且具有非常好的无误传输信噪比。这可以通过发送以下at命令来完成。
AT+IPR=9600
如果在传输开始时没有响应,则继续发送字符“A”,这将重置该特定会话的波特率。
GSM调制解调器要求命令以CR、LF或CR+LF终止,以完成传输,否则将显示发送的文本。终端字符取决于GSM调制解调器的类型。已执行的程序仅以铬(R)作为结尾字符。
库:
蒂乌埃斯
TI_AES库是一个具有两个主要函数的库,调用这两个函数可使用预设密钥对状态进行128位加密或解密。
Aes_encrypt (unsigned char *state, unsigned char *key);
aes_解密(无符号字符*状态,无符号字符*密钥);
上面两个函数改变存储在对应函数状态中的值。
液晶
这是Arduino中的预定义库,实现了与16×2液晶显示器的接口部分。
复位、启用和数据D0–D3的LCD引脚由引脚12、9、5、4、3、2使用函数调用进行设置
液晶显示器(12,9,5,4,3,2);
软件系列
这是另一个预定义的库,用于将Arduino上的GPIO引脚转换为UART。
预定义的SoftwareSerial库的问题是,它的默认缓冲区大小为64字节,但当一个短信由GSM接收在未经请求的模式下,它将发送与消息相关的所有数据,如发送者编号时间和日期消息长度消息存储位置索引和原始消息本身,这些数据将超过此缓冲区大小并产生溢出。为避免缓冲区溢出情况,必须在软件系列头文件如下所示,
- 打开Arduino安装文件夹
- 使用关键字搜索文件夹和所有子目录软件系列(它几乎总是在图书馆或自由文件夹,但有时已将其移动到avr取决于软件的版本和衍生产品,如Teensyduino)
- 使用以下命令打开文件记事本或记事本++同时确保打开所述文件的文本编辑器具有对其进行任何修改的管理权限。
- 在43理查德·道金斯行将Rx缓冲区大小64字节替换为256字节,如下所示
#define _SS_MAX_RX_BUFF 64 // RX缓冲区大小
取代
#定义_SS_MAX_RX_BUFF 256//RX缓冲区大小
图7:软件串行库中Arduino代码的屏幕截图
注意:通过调用软件序列mySerial(10,11);我们制作大头针10作为接收和11作为TX
从初始化开始的所有通信都是使用mySerial作为类型的对象软件系列使用各种函数调用,例如
·mySerial。打印(“这传送文本”);
·mySerial.read ();从调制解调器读取一个字节的数据
·mySerial.available ();评估RX缓冲区中数据的可用性
·mySerial.flush ();刷新缓冲区
而且很快。
完成后:使用ram和rom
图8:用于AES解密的Arduino代码截图
测试方法与输出
测试方法:
如上述所述进行所有必要的连接,连接电线,将simacard插入gsm modem,使用上传按钮将程序烧录到Arduino上,Nowits准备测试
注意:密码密钥是:一个好的密码
明文:1 a2b3c4d5e6f7g8h
密文:?" *^(&*(M //像这样,所以我们使用十六进制ascii
十六进制
纯文本=4142434445464748494a4b4c4d4e4f50,密钥=4120564474F4F420504553574F5244,密文=DF4073B52B4B2F41A23120B35CC16C7
要解密的消息
将sms发送到gsm板上的sim卡,如下所示:
您的otp是d < df4073b52b4b2f41a23120b35ccc16c7 >
这将显示纯文本1A2B3C4D5E6F7G8H在LCD上
要加密的消息
将sms发送到gsm板上的sim卡,如下所示:
您的OTP是E<1A2B3C4D5E6F7G8H>
密文在LCD上显示为df4073b52b4b2f41a23120b35ccc16c7
消息设置键
将sms发送到gsm板上的sim卡,如下所示:
您的OTP为K<412056474F4420420531535574F5244>这将设置新的密码密钥
这将在LCD上显示新钥匙as 412056474F44204205153574F5244
其他一些组合(注:纯文本为十六进制转换)
纯文本=4142434445464748494A4B4C4D4E4F50,密钥=4120564474F4F420504553574F5244,密文=DF4073B52B4B2F41A23120B35CC16C7
明文= 414141414141414141414141414141414141414142,密钥= 412056474f4f442050415353574f5244,密文= fa3991ad512bf5e50f15d13787b0ef7a
纯文本=414241424142,密钥=412056474F442042054535574F5244,密文=D1AAA99CA3530FA43C3B9BC56E0747D3
纯文本=5A5A59,密钥=412056474F4420405153574F5244,密文=0D3E1749F9A96FE0A7BD987100106EA2
明文=30313233343536373839414243444546,密钥= 412056474f4f442050415353574f5244,密文= 5d29c69f5b46f7da6a9b29027e48899c
纯文本=4D59204E414D452044953205157455254,密钥=4120564744F44204504535574F5244,密文=791D37FC05F82119AEBEF6BFAA60D05A
纯文本=4D59204E414D4520453205120515745253,密钥=4120564744F442045045353574F5244,密文=17400580C483E1DF5C58B6B45071F0F9
纯文本=4D592047415020414C474F524954484D,密钥=412056474F44204504535574F5244,密文=05EA4011B3E9F8E0DEE983E62ADF1ED8
明文= 7e21402324255e262a28295f2b7b7d7c,密钥= 412056474f4f442050415353574f5244,密文= dd3e77fa6b32e310eb2916bc4cbf8612
Plain text = 564c53492645532053545544454e5453, key = 412056474f4f442050415353574f5244, cipher
TEXT=D7A3B95834D34FF2DCA04AE9034C6C46
结果:
各种接线电路和显示结果。
图9:显示AES解密设备初始化的图像
在安装开始时
图10:在AES解密设备上显示安装完成消息的图像
在安装结束时
图11:显示在AES解密设备上接收到的解密消息的图像
当发送加密消息以进行解密时
图12:显示从AES加密设备发送的加密消息的图像
图13:显示在AES解密设备上接收到的解密消息体的图像
发送要加密的纯文本时
项目源代码
#### include < LiquidCrystal.h ># include < SoftwareSerial.h >#包括“TI_AES.h”#包括“TI_AES.C”安装软件串行端口软件序列mySerial(10,11);初始化液晶针液晶显示器(12,9,5,4,3,2);全局变量int 13;//设备心跳密钥[]=<16字节的值>//密码密钥/*设置函数从这里开始无效设置(){//所有初始化都在此处进行,并且只执行一次pinMode(领导、输出);digitalWrite(领导、高);//设置心跳监视器为1液晶显示器。开始(16日2);//设置LCD的列和行数:lcd.clear ();//清除LCD上的所有字符。lcd.print(“DENcryptor”);//lcd测试显示DENcryptor延迟(1000);Serial.begin (9600);//只在使用普通串行连接的PC上调试系列。写(“Arduino启动. . !");//串行测试消息Serial.write(“嗨,程序员”);//向程序员问好以();//只换行延迟(500);setCursor(0,0);//将lcd上的光标设置为起始位置lcd.clear();//清除显示lcd.print(“设置参数”);//显示当前操作,即设置调制解调器参数mySerial.begin(9600);//与GSM调制解调器的软件串行通信延迟(2000);//给2秒钟初始化,然后开始通信mySerial.print(“在+ CMGF = 1 r”);//设置Modem为文本模式延迟(300);//命令之间至少有300毫秒的间隔mySerial.print(“+ CNMI = 2 2 0, 0, 0 r”);//将消息指示设置为UnsolicitedmySerial.print (r);//换行符来执行前一个命令延迟(300);mySerial.print(“AT+CSMP=17167,0,0r”);//如果使用Unicode,则为可选集延迟(300);mySerial.print(“AT+CSCS=“IRA”r”);//将文本编码更改为ASCII延迟(300);mySerial.print(“在+二者= " GSM r);//修改文本编码为ASCII冗余延迟(300);lcd.clear ();//清晰显示在LCD上lcd.setCursor(0,0);//将光标设置为home位置lcd.打印(“设置完成”);//显示安装完成消息}/*while循环的开始*/空循环(){{while(mySerial.available()<=0);//等待来自调制解调器的任何串行数据MyserialEvent ();//如果数据是可用的,跳转到事件循环并开始处理数据}}/*由于代码目前没有模块化,所有操作都发生在mySerialEvent()内部*/voidMyserialEvent() //函数名{延迟(100);//设置毫秒的初始延迟String inputString=”“;//创建字符串变量以存储传入消息字符串inputString.reserve(192);//提前保留192字节最大字符串长度为160字节/smsbooleangotdata = false;//创建一个标志来表示数据到达无符号字符Decrypted_SMS [16];// 16字节存储AES状态/密钥/密文字符串myLCD;//创建字符串,在LCD上存储和显示相应的数据myLCD.reserve (10);//保留10个字符..需要时可以改成32吗印锑,j;//为循环和索引目的的变量的局部声明if(mySerial.overflow())//这是表示缓冲区溢出的内置调用以“溢出”);//缓冲区溢出while(mySerial.available()>0)//检查可用的数据字节{延迟(5);//等待几毫秒,以便数据解决其他可能的损坏inputString+=(char)mySerial.read();//获取连接到字符串的字节延迟(5);//等待几毫秒,以便数据消除损坏的可能性}以(" ");//一个新的行字符在调试窗口的PCSerial.println(“接收数据”);//通知程序员数据到达如果(inputString!=“”)gotdata = true;//设置数据到达标志为trueif(gotdata)//如果数据可用,则只输入此部分{Serial.println(inputString);//将存储的数据打印到调试窗口}intlastOpeningBracket=inputString.lastIndexOf(“<”);//搜索OTP的起始位置intlastClosingBracket=inputString.lastIndexOf('>');//搜索OTP的结束位置if(lastOpeningBracket!=-1和lastClosingBracket!=-1&(inputString[lastOpeningBracket-1]='D'| inputString[lastOpeningBracket-1]='D')){//仅当找到两个字符以及关于是否执行解密的指令时,请输入此处,否则请检查下一节Int j = 0;for(i= lastopingbracket + 1;i < lastopingbracket;i = i + 2){//获取从索引(<)+1开始到索引(<)的OTP的所有字符//总共收集32个字节,然后将其转换为16个字节,即读取十六进制值,并为成对的后续字符计算ASCII值。开关(inputString[我]){案例“0”:解密的\u SMS[j]=0x00;中断;案例“1”:解密的_SMS[j]=0x10;中断;case '2': Decrypted_SMS[j] = 0x20;打破;案例“3”:解密的_SMS[j]=0x30;中断;case '4': Decrypted_SMS[j] = 0x40;打破;case '5': Decrypted_SMS[j] = 0x50;打破;case '6': Decrypted_SMS[j] = 0x60;打破;案例“7”:解密的_SMS[j]=0x70;中断;case '8': Decrypted_SMS[j] = 0x80;打破;case '9': Decrypted_SMS[j] = 0x90;打破;案例“A”:解密的_SMS[j]=0xA0;打破case 'B': Decrypted_SMS[j] = 0xB0;打破;案例“C”:解密的_SMS[j]=0xC0;打破case 'D': Decrypted_SMS[j] = 0xD0;打破;案例“E”:解密的_SMS[j]=0xE0;打破case 'F': Decrypted_SMS[j] = 0xF0;打破;}开关(输入字符串[i+1]){case 0x30: Decrypted_SMS[j] = Decrypted_SMS[j] + 0x00;打破;案例0x31:解密的_-SMS[j]=解密的_-SMS[j]+0x01;中断;案例0x32:Decrypted_SMS[j]=Decrypted_SMS[j]+0x02;中断;案例0x33:解密的_-SMS[j]=解密的_-SMS[j]+0x03;中断;案例0x34:解密的_-SMS[j]=解密的_-SMS[j]+0x04;中断;case 0x35: Decrypted_SMS[j] = Decrypted_SMS[j] + 0x05;打破;案例0x36:解密短信[j]=解密短信[j]+0x06;中断;案例0x37:解密短信[j]=解密短信[j]+0x07;中断;案例0x38:解密的_-SMS[j]=解密的_-SMS[j]+0x08;中断;案例0x39:解密短信[j]=解密短信[j]+0x09;中断;案例0x41:解密的_-SMS[j]=解密的_-SMS[j]+0x0A;打破案例0x42:解密短信[j]=解密短信[j]+0x0B;中断;案例0x43:解密的_-SMS[j]=解密的_-SMS[j]+0x0C;打破case 0x44: Decrypted_SMS[j] = Decrypted_SMS[j] + 0x0D;打破;case 0x45: Decrypted_SMS[j] = Decrypted_SMS[j] + 0x0E;打破;案例0x46:解密的_-SMS[j]=解密的_-SMS[j]+0x0F;打破}j = + 1;}以(" ");//发送一个后跟解密字符的换行符到调试窗口if(inputString[lastOpeningBracket-1]=='d')//执行解密(冗余比较){aes_decrypt(解密的_SMS,密钥);//执行解密}if(inputString[lastOpeningBracket-1]=='D')//执行解密(冗余比较){aes_decrypt(解密的_SMS,密钥);//执行解密}系列。打印(“破译文字:”);(我= 0;< 16,我+ +){//将解密后的副本发送到调试窗口Serial.print(字符(解密的短信[i]);}lcd.clear();//清除lcd。lcd.setCursor(0,0);液晶显示器。打印(“解密文本”);lcd.setCursor(0,1);//转到第二行(我= 0;< 16,我+ +){lcd.print(字符(解密的短信[i]);//显示液晶显示器}}if((lastOpeningBracket!=-1)和(lastClosingBracket!=-1)和(inputString[lastOpeningBracket-1]='E'| inputString[lastOpeningBracket-1]='E')){//只有当这两个字符都被找到,以及是否执行加密的指令被找到,进入这里else检查下一节//以ASCII格式获取纯文本并以块形式存储数据Int j = 0;对于(i=lastOpeningBracket+1;i{//获取从索引(<)+1开始到索引(<)的OTP的所有字符解密的_SMS[j]=inputString.charAt(i);j=j+1;}系列。打印(“神秘的文字:”);(我= 0;< 16,我+ +){Serial.print(char(解密的_SMS[i]);//显示纯文本以进行调试}以(" ");if(inputString[lastOpeningBracket-1]=“e”){aes_encrypt(解密的_SMS,密钥);//执行加密}if(inputString[lastOpeningBracket-1]=“E”){aes_encrypt(解密的_SMS,密钥);//执行加密}Serial.print(“加密文本:”);(我= 0;< 16,我+ +){Serial.print(字符(解密的短信[i]);}以(" ");lcd.clear();//清除lcd。lcd.setCursor(0,0);//返回home位置lcd.打印(“加密文本”);无符号字符Decrypted_SMS1;//我们需要将密文转换为十六进制ascii码以在LCD上显示,否则一些字符将显示为' ??”lcd.clear();//清除lcd。lcd.setCursor(0,0);(我= 0;< 16,我+ +){//将ASCII码转换为十六进制ASCII码,在LCD上显示10110101为B5如果(i==8)lcd.setCursor(0,1);//设置LCD的列数和行数:交换机(已解密的\u SMS[i]&0xF0){案例0x00:解密的_SMS1=0x30;中断;case 0x10: Decrypted_SMS1 = 0x31;打破;案例0x20:解密的\u SMS1=0x32;中断;case 0x30: Decrypted_SMS1 = 0x33;打破;case 0x40: Decrypted_SMS1 = 0x34;打破;case 0x50: Decrypted_SMS1 = 0x35;打破;case 0x60: Decrypted_SMS1 = 0x36;打破;案例0x70:解密的_SMS1=0x37;中断;case 0x80: Decrypted_SMS1 = 0x38;打破;案例0x90:解密的_SMS1=0x39;中断;case 0xA0: Decrypted_SMS1 = 0x41;打破;案例0xB0:解密的_SMS1=0x42;中断;case 0xC0: Decrypted_SMS1 = 0x43;打破;案例0xD0:解密的_SMS1=0x44;中断;案例0xE0:解密的_SMS1=0x45;打破案例0xF0:解密的_SMS1=0x46;中断;}串行打印(字符(解密的_SMS1));lcd.print(char(解密的_SMS1));switch((Decrypted_SMS[i] << 4) & 0xF0){案例0x00:解密的_SMS1=0x30;中断;case 0x10: Decrypted_SMS1 = 0x31;打破;案例0x20:解密的\u SMS1=0x32;中断;case 0x30: Decrypted_SMS1 = 0x33;打破;case 0x40: Decrypted_SMS1 = 0x34;打破;case 0x50: Decrypted_SMS1 = 0x35;打破;case 0x60: Decrypted_SMS1 = 0x36;打破;案例0x70:解密的_SMS1=0x37;中断;case 0x80: Decrypted_SMS1 = 0x38;打破;案例0x90:解密的_SMS1=0x39;中断;case 0xA0: Decrypted_SMS1 = 0x41;打破;案例0xB0:解密的_SMS1=0x42;中断;case 0xC0: Decrypted_SMS1 = 0x43;打破;案例0xD0:解密的_SMS1=0x44;中断;案例0xE0:解密的_SMS1=0x45;打破案例0xF0:解密的_SMS1=0x46;中断;}串行打印(字符(解密的_SMS1));lcd.print(char(解密的_SMS1));}}inputString[lastOpeningBracket -1] == 'K' | inputString[lastOpeningBracket -1] == 'K' | inputString[lastOpeningBracket -1] == 'K'{//只有在找到两个字符以及设置新密码密钥的指令时,才执行此部分,否则返回空闲状态Int j = 0;for(i= lastopingbracket + 1;i < lastopingbracket;i = i + 2){//获取从索引(<)+1开始到索引(<)的OTP的所有字符开关(inputString[我]){案例“0”:解密的\u SMS[j]=0x00;中断;案例“1”:解密的_SMS[j]=0x10;中断;case '2': Decrypted_SMS[j] = 0x20;打破;案例“3”:解密的_SMS[j]=0x30;中断;case '4': Decrypted_SMS[j] = 0x40;打破;case '5': Decrypted_SMS[j] = 0x50;打破;case '6': Decrypted_SMS[j] = 0x60;打破;案例“7”:解密的_SMS[j]=0x70;中断;case '8': Decrypted_SMS[j] = 0x80;打破;case '9': Decrypted_SMS[j] = 0x90;打破;案例“A”:解密的_SMS[j]=0xA0;打破case 'B': Decrypted_SMS[j] = 0xB0;打破;案例“C”:解密的_SMS[j]=0xC0;打破case 'D': Decrypted_SMS[j] = 0xD0;打破;案例“E”:解密的_SMS[j]=0xE0;打破case 'F': Decrypted_SMS[j] = 0xF0;打破;}开关(输入字符串[i+1]){case 0x30: Decrypted_SMS[j] = Decrypted_SMS[j] + 0x00;打破;案例0x31:解密的_-SMS[j]=解密的_-SMS[j]+0x01;中断;案例0x32:Decrypted_SMS[j]=Decrypted_SMS[j]+0x02;中断;案例0x33:解密的_-SMS[j]=解密的_-SMS[j]+0x03;中断;案例0x34:解密的_-SMS[j]=解密的_-SMS[j]+0x04;中断;case 0x35: Decrypted_SMS[j] = Decrypted_SMS[j] + 0x05;打破;案例0x36:解密短信[j]=解密短信[j]+0x06;中断;案例0x37:解密短信[j]=解密短信[j]+0x07;中断;案例0x38:解密的_-SMS[j]=解密的_-SMS[j]+0x08;中断;案例0x39:解密短信[j]=解密短信[j]+0x09;中断;案例0x41:解密的_-SMS[j]=解密的_-SMS[j]+0x0A;打破案例0x42:解密短信[j]=解密短信[j]+0x0B;中断;案例0x43:解密的_-SMS[j]=解密的_-SMS[j]+0x0C;打破case 0x44: Decrypted_SMS[j] = Decrypted_SMS[j] + 0x0D;打破;case 0x45: Decrypted_SMS[j] = Decrypted_SMS[j] + 0x0E;打破;案例0x46:解密的_-SMS[j]=解密的_-SMS[j]+0x0F;打破}//将密码密钥存储在密钥变量中。关键[j] = Decrypted_SMS [j];j = + 1;}以(" ");Serial.print(“密码密钥:”);(我= 0;< 16,我+ +){并同时(char(关键[我]));}lcd.clear();//清除lcd。lcd.setCursor(0,0);打印(“密码密钥:”);lcd.setCursor(0,1);(我= 0;< 16,我+ +){打印(字符(键[i]);//显示lcd}}}###
电路图
根据以下文件提交:188金宝搏提款有问题吗