最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

Android实现信息安全中维吉尼亚密码技术

IT培训 admin 3浏览 0评论

Android实现信息安全中维吉尼亚密码技术

   

          人们在单一恺撒密码的基础上扩展出多表密码,称为“维吉尼亚”密码。是法国密码学家维吉尼亚在1586年提出的一种多表替代密码,维吉尼亚密码引入了“密钥”的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。

下面就让我们来用安卓技术,在Android平台上进行加解密的实现:

    首先进行创建一个项目,其加密布局文件代码如下图所示,

  其中textView_inform用于显示加解密类型,relative_miyue_ptc用于添加密钥所使用的组件,et_plainttext为明文,即要加密的字符,btn_plainttexttociphertext按钮是实现点击事件

    <TextViewandroid: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><EditTextandroid: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><Buttonandroid: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实现信息安全中维吉尼亚密码技术

   

          人们在单一恺撒密码的基础上扩展出多表密码,称为“维吉尼亚”密码。是法国密码学家维吉尼亚在1586年提出的一种多表替代密码,维吉尼亚密码引入了“密钥”的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。

下面就让我们来用安卓技术,在Android平台上进行加解密的实现:

    首先进行创建一个项目,其加密布局文件代码如下图所示,

  其中textView_inform用于显示加解密类型,relative_miyue_ptc用于添加密钥所使用的组件,et_plainttext为明文,即要加密的字符,btn_plainttexttociphertext按钮是实现点击事件

    <TextViewandroid: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><EditTextandroid: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><Buttonandroid: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 还原后的文本显示



以上就是对维吉尼亚密码加解密方式的实现,其具体原理可参见:信息安全技术中的维吉尼亚加密技术





发布评论

评论列表 (0)

  1. 暂无评论