Android实现信息安全中维吉尼亚密码技术
16lz
2021-01-26
人们在单一恺撒密码的基础上扩展出多表密码,称为“维吉尼亚”密码。是法国密码学家维吉尼亚在1586年提出的一种多表替代密码,维吉尼亚密码引入了“密钥”的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。
下面就让我们来用安卓技术,在Android平台上进行加解密的实现:
首先进行创建一个项目,其加密布局文件代码如下图所示,
其中textView_inform用于显示加解密类型,relative_miyue_ptc用于添加密钥所使用的组件,et_plainttext为明文,即要加密的字符,btn_plainttexttociphertext按钮是实现点击事件
<TextView android:id="@+id/textView_inform" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:text="对象类型" /> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/relative_miyue_ptc" android:layout_below="@+id/textView_inform" > </RelativeLayout> <EditText android:id="@+id/et_plaintext" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView_inform" android:layout_alignParentBottom="true" android:ems="10" android:hint="这是明文..." android:inputType="textMultiLine" android:textColor="#007700" > <requestFocus /> </EditText> <Button android:id="@+id/bn_plaintexttociphertext" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignRight="@+id/textView_inform" android:layout_below="@+id/textView_inform" android:layout_marginTop="18dp" android:alpha="0.8" android:background="@drawable/upomp_bypay_btn_big_bg_click" android:text="加密" />解密布局文件和加密类似,仅仅是按钮上显示的字符不同,在这就不贴出来了。
下面来实现加密过程:
//维吉尼亚加密方式et_plaintext.setText(str_isctp); //将从解密界面传来的数据放置到文本编辑框中System.out.println("选择的是" + passIntent.x + "\t" + passIntent.y+ " :"+passIntent.name_intent);//绑定布局文件RelativeLayout relative=(RelativeLayout) findViewById(R.id.relative_miyue_ptc);//添加密钥组件,用于输入密钥final EditText et_miyue=new EditText(this);et_miyue.setId(24);et_miyue.setHint("请输入密钥...");et_miyue.setSingleLine(true);relative.addView(et_miyue);/////////////////////////////////////////////bn_plaintexttociphertext.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if (v.isPressed())// 加密{// 获取密钥和明文String miyue = et_miyue.getText().toString();String str_p = et_plaintext.getText().toString();char[] miyue_c = null;char[] str_p_char = null;int k = 0;if (miyue.isEmpty()||str_p.isEmpty()){ Toast.makeText(Result_PTC.this, "请输入密钥或明文...",1).show();} else {try {miyue_c = miyue.toCharArray();str_p_char = str_p.toCharArray();}catch (Exception e) {System.out.println("Exception");}int len = str_p_char.length;int len_miyue_c = miyue_c.length;int i_miyue=0;for (int j = 0; j < len; j++){if (str_p_char[j] >= 'a'&& str_p_char[j] <= 'z'){ k = miyue_c[i_miyue%len_miyue_c] - 'a'; i_miyue++; int value_ascii = (((str_p_char[j]-'a'+k))%26)+'a'; str_p_char[j] = (char) (value_ascii);} else { str_p_char[j] = str_p_char[j];}}StringBuffer sb = new StringBuffer();for (int i = 0; i < len; i++){sb.append(str_p_char[i]);}str_p = sb.toString();et_plaintext.setEnabled(true);Toast.makeText(Result_PTC.this,"已加密...", Toast.LENGTH_SHORT).show(); // 创建一个意图Intent intent = new Intent(Result_PTC.this,Result_CTP.class);// 传递自定义数据// 第一种传值方式,创建一个Bundle对象// 传递自定义数据PassIntent passIntent = new PassIntent();passIntent.id_opt = id_opt;passIntent.x = ptc_x;passIntent.y = ptc_y;passIntent.name_intent = ptc_name_intent;passIntent.str_ptc = str_p;intent.putExtra("passIntent",passIntent);// 启动另外一个ActivitystartActivity(intent);finish(); } }} });}下面是解密方式的源代码:
//维吉尼亚解密方式System.out.println("选择的是" + passIntent.x + "\t" + passIntent.y+ " :"+passIntent.name_intent); et_ciphertext.setText(str_isptc); //绑定布局文件 RelativeLayout relative=(RelativeLayout) findViewById(R.id.relative_miyue_ctp); //添加密钥组件,用于输入密钥 final EditText et_miyue=new EditText(this); et_miyue.setId(25); et_miyue.setHint("请输入密钥..."); et_miyue.setSingleLine(true); relative.addView(et_miyue);bn_ciphertexttoplaintext.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if (v.isPressed())// 解密{String miyue=et_miyue.getText().toString();String str_c = et_ciphertext.getText().toString();char []miyue_c=null;char []str_c_char = null;int k=0;if(miyue.isEmpty()||str_c.isEmpty()){Toast.makeText(Result_CTP.this, "请输入密钥或密文...",1).show();}else{try{miyue_c=miyue.toCharArray();str_c_char=str_c.toCharArray(); }catch(Exception e){System.out.println("Exception");}int len=str_c_char.length;int len_miyue_c=miyue_c.length;int i_miyue=0; for(int j=0;j<len;j++) { //输出得到的字符串,也就是从文本编辑框得到的密文//System.out.println("str_c_char["+j+"]:"+str_c_char[j]);//对明文进行加密 if(str_c_char[j]>='a'&&str_c_char[j]<='z') { k=miyue_c[i_miyue%len_miyue_c]-'a'; //System.out.println("miyue_c["+i_miyue+"]:"+miyue_c[i_miyue%len_miyue_c]); i_miyue++; int temp=(str_c_char[j]-'a')-k; if(temp>=0) {int value_ascii=((temp)%26)+'a';str_c_char[j]=(char) (value_ascii); } else { int value_ascii=((temp+26)%26)+'a'; str_c_char[j]=(char) (value_ascii); } } }StringBuffer sb = new StringBuffer();for(int i = 0; i <len; i++){ sb. append(str_c_char[i]);}str_c = sb.toString(); System.out.println("解密后的字符串:"+str_c);et_ciphertext.setEnabled(true);Toast.makeText(Result_CTP.this, "已解密...",Toast.LENGTH_SHORT).show();///////直接转入到加密后的文件中//创建一个意图Intent intent=new Intent(Result_CTP.this,Result_PTC.class);//传递自定义数据//第一种传值方式,创建一个Bundle对象//传递自定义数据PassIntent passIntent=new PassIntent();passIntent.id_opt= id_opt;passIntent.x=ctp_x;passIntent.y=ctp_y;passIntent.name_intent=ctp_name_intent;passIntent.str_ctp=str_c;intent.putExtra("passIntent", passIntent);//启动另外一个ActivitystartActivity(intent); finish();}}}});}
代码中PassIntent是一个接口类,页面之间数据的传递,读者可以直接使用Intent传值的其他几种方式代替。
下面为加解密效果图:
图1 密钥及要加密的文本
图2 加密后的文本显示
图 3 还原后的文本显示
以上就是对维吉尼亚密码加解密方式的实现,其具体原理可参见:信息安全技术中的维吉尼亚加密技术
更多相关文章
- [Android] 基于 Linux 命令行构建 Android(安卓)应用(四):命令行构
- java &android base64加密解密
- 裁判文书App(2020最新版) 逆向过程分析
- java之php、Android、JAVA、C# 3DES加密解密
- Android界面跳转时候onDestroy和onResume的调用顺序
- android软件安全与逆向分析重打包签名出错
- Android签名用keytool和jarsigner制作apk文件
- openssl加密
- android google map v1 v2 v3 参考