添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
傲视众生的枇杷  ·  PowerBI - ...·  2 月前    · 
还单身的白开水  ·  Spark Sql实战: ...·  1 年前    · 
打盹的泡面  ·  VS Code Mac ...·  1 年前    · 

原文地址:http://kewell2004.iteye.com/blog/2360726

RSA随机填充算法种类,包括NoPadding、ISO10126Padding、OAEPPadding、PKCS1Padding、PKCS5Padding、SSL3Padding,OAEPPadding、PKCS1Padding等。
.Net的实现用的是PKCS1Padding,而且只有这一种实现。
Java的实现,主要通过Cipher.getInstance实现,传入的参数是描述为产生某种输出而在给定的输入上执行的操作(或一组操作)的字符串。必须包括加密算法的名称,后面可能跟有一个反馈模式和填充方案。这样的实现就比较灵活,我们可以通过参数指定不同的反馈模式和填充方案;比如Cipher.getInstance("RSA/ECB/PKCS1Padding"),或者Cipher.getInstance("RSA")均可,但用其加密的效果也会不一样;java中默认填充方式是RSA/ECB/PKCS1Padding。
Android的默认填充算法不是(没找到是什麽),但可以指定为以下类型。
RSA/ECB/NoPadding 1+
RSA/ECB/OAEPPadding 1+
RSA/ECB/OAEPwithSHA-1andMGF1Padding 10+
RSA/ECB/OAEPwithSHA-256andMGF1Padding 10+
RSA/ECB/PKCS1Padding 1+
RSA/NONE/NoPadding 1+
RSA/NONE/OAEPPadding 1+
RSA/NONE/OAEPwithSHA-1andMGF1Padding 10+
RSA/NONE/OAEPwithSHA-256andMGF1Padding 10+
RSA/NONE/PKCS1Padding 1+

https://developer.android.com/reference/javax/crypto/Cipher.html

某种特殊的方法,更改已有信息的内容,使得未授权的用户即使得到 了加密信息,如果没有正确解密的方法,也无法得到信息的内容。谈 到加密的话题,一些读者一定非常感兴趣,而且会联想到复杂的加密 算法 ,本实例主要使用异或“^”运算符简单地实现了对数字加密的 功能。实例运行效果如图19.1 所示。 关 键技术 本实例实现时主要使用了“异或”运算符对数字进行“异或”运 算,以达到简单加密数字的目的,下面对其进行详细讲解。 “异或”运算符“^”用于比较两个二进制数的相应位。在执行按位“异或”运算时,如果两个二进制数的 相应位都为1 或两个二进制数的相应位都为0,则返回0;如果两个二进制数的相应位其中一个为1 一个为0, 则返回1。 现在来了解一下使用“异或”加密或解密的执行过程,数值23 转换为二进制为10111,加密数字的数值15 转换为二进制为1111。对比两个二进制的值,从右向左按位对比,如果两个二进制数的相应位都为1 或两个二 进制数的相应位都为0,则返回0;如果两个二进制数的相应位中一个为1 一个为0,则返回1,最后得到的结 果为二进制值11000,该值转换为十进制为24,所以得到的加密结果为24。而解密过程也很简单,只是将加密 结果24与加密数字15 进行“异或”运算,将24 转换为二进制值11000,将15 转换为二进制值1111,进行“异 或”运算后,得到结果为23,这样又还原了加密的数据。 说明:本实例只是简单地使用了“异或”运算符计算两个整型数值以达到加密的目的,所以本实例只可以 对整型数值进行加密运算,并不适合其他数据的加密。 设 计过程 (1)打开Visual Studio 2008 开发 环境 ,新建一个Windows窗体应用程序,并将其命名为Encrypt。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体中添加两个GroupBox 容器控件,其中, 在第一个GroupBox 中放入3 个TextBox 控件和一个Button 按钮,分别用于输入数字、输入加密数字、显示加 密后的数字和计算加密信息;在第二个GroupBox 中放入一个TextBox 控件和一个Button 按钮,分别用于显示 解密后的信息和计算解密信息。 (3)程序主要代码如下: private void btn_Encrypt_Click(object sender, EventArgs e) int P_int_Num, P_int_Key; //定义两个值类型变量 if (int.TryParse(txt_Num.Text, out P_int_Num) //判断输入是否是数值 && int.TryParse(txt_Key.Text, out P_int_Key)) txt_Encrypt.Text = (P_int_Num ^ P_int_Key).ToString(); //加密数值 图19.1 异或 算法 对数字进行加密与解密 C#开发实战1200 例(第II卷) MessageBox.Show("请输入数值", "出现错误!"); //提示输入信息不正确 private void btn_Revert_Click(object sender, EventArgs e) int P_int_Key, P_int_Encrypt; //定义两个值类型变量 if (int.TryParse(txt_Encrypt.Text, out P_int_Key) //判断输入是否是数值 && int.TryParse(txt_Key.Text, out P_int_Encrypt)) txt_Revert.Text = (P_int_Encrypt ^ P_int_Key).ToString(); //解密数值 MessageBox.Show("请输入数值", "出现错误!"); //提示输入信息不正确 秘 笈心法 心法领悟571:简述“异或”运算符。 本实例使用了“异或”运算符,但是在使用“异或”运算符之前,有必要了解“异或”运算符所做的“异 或”运算的机制,“异或”运算符“^”用于比较两个二进制数的相应位。在执行按位“异或”运算时,如果两 个二进制数的相应位都为1 或两个二进制数的相应位都为0,则返回0;如果两个二进制数的相应位中一个为1 一个为0,则返回1。 实例572 使用MD5 算法 加密数据 光盘位置:光盘\MR\19\572 趣味指数: 实 例说明 MD5(Message-Digest Algorithm 5)是一种被广泛使用的“消息-摘要 算法 ”。“消息-摘要 算法 ”实际上就是一个单项散列函数,数据块通过单 向散列函数得到一个固定长度的散列值,数据块的签名就是计算数据块的散 列值,MD5 算法 的散列值为128 位。本实例演示如何使用MD5 算法 对用户 输入的密码进行加密,实例运行效果如图19.2 所示。 关 键技术 本实例在实现时主要用到了MD5类的ComputeHash 方法,下面对其进行详细讲解。 MD5 类表示MD5 哈希 算法 的所有实现均从中继承的抽象类,该类位于System.Security.Cryptography 命名 空间下,其ComputeHash 方法有3种重载形式,分别介绍如下。 计算指定字节数组的哈希值,语法格式如下: public byte[] ComputeHash(byte[] buffer) buffer:要计算其哈希代码的输入。 返回值:计算所得的哈希代码。 计算指定Stream 对象的哈希值,语法格式如下: public byte[] ComputeHash(Stream inputStream) inputStream:要计算其哈希代码的输入。 返回值:计算所得的哈希代码。 图19.2 使用MD5 算法 加密数据 第19章 加密与解密技术 计算指定字节数组的指定区域的哈希值,语法格式如下: public byte[] ComputeHash(byte[] buffer,int offset,int count) ComputeHash 方法中的参数及说明如表19.1 所示。 表19.1 ComputeHash方法中的参数及说明 参 数 说 明 buffer 要计算其哈希代码的输入 offset 字节数组中的偏移量,从该位置开始使用数据 count 数组中用作数据的字节数 返回值 计算所得的哈希代码 说明:本实例用到了ComputeHash 方法的第一种重载形式。 设 计过程 (1)打开Visual Studio 2008 开发 环境 ,新建一个Windows窗体应用程序,并将其命名为MD5Arithmetic。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体中添加两个TextBox 控件,分别用来输入 要加密的数据和显示加密后的字符串;添加一个Button 控件,用来使用MD5 算法 对输入的数据进行加密。 (3)程序主要代码如下: public string Encrypt(string strPwd) MD5 md5 = new MD5CryptoServiceProvider(); //创建MD5 对象 byte[] data = System.Text.Encoding.Default.GetBytes(strPwd); //将字符编码为一个字节序列 byte[] md5data = md5.ComputeHash(data); //计算data字节数组的哈希值 md5.Clear(); //清空MD5 对象 string str = ""; //定义一个变量,用来记录加密后的密码 for (int i = 0; i < md5data.Length - 1; i++) //遍历字节数组 str += md5data[i].ToString("x").PadLeft(2, '0'); //对遍历到的字节进行加密 return str; //返回得到的加密字符串 private void button1_Click(object sender, EventArgs e) string P_str_Code = textBox1.Text; //记录要加密的密码 textBox2.Text = Encrypt(P_str_Code); //显示加密后的字符串 秘 笈心法 心法领悟572:如何判断是否为数字? 开发程序时,经常需要判断输入的字符串是否为数字,如判断输入的电话号码、货币金额和邮编等。在程 序中判断是否为数字的方法有很多种,可以使用正则表达式、int.Parse 方法和double.Parse 方法等。下面的代码 通过double.Parse 方法判断textBox1 文本框中的输入是否为数字。 double.Parse(textBox1.Text); 实例573 使用ROT13 算法 加密解密数据 光盘位置:光盘\MR\19\573 趣味指数: 实 例说明 文件加密可以避免造成重要信息的泄漏,复杂的加密 算法 可以将信息加密得非常繁杂,但是对于一般的应 用,没有必要作类似于PGP、 RSA 或DES 等复杂的加密 算法 。本实例介绍如何使用ROT13 算法 加密和解密数 C#开发实战1200 例(第II卷) 据。实例运行效果如图19.3 所示。 图19.3 使用ROT13 算法 加密解密数据 关 键技术 本实例实现时,主要是用Convert 类的ToChar 方法来获取单个字符的Unicode 编码,然后将字母的前13 个和后13 个对调,从而实现加密的功能。下面对Convert类的ToChar 方法进行详细讲解。 ToChar 方法返回指定的Unicode字符值,并且不执行任何实际的转换,其语法格式如下: public static char ToChar (char value) value:一个Unicode 字符。 设 计过程 (1)打开Visual Studio 2008 开发 环境 ,新建一个Windows窗体应用程序,并将其命名为ROT13Encrypt。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体中添加两个TextBox 控件,分别用来显示 原始数据和解密后的数据;添加两个Button 控件,分别用来实现利用ROT13 算法 加密和解密数据的功能。 (3)程序主要代码如下: public string ROT13Encode(string InputText) char tem_Character; //存储临时字符 int UnicodeChar; //存储临时字符的字节值 string EncodedText = ""; //存储加密或解密后的字符串 for (int i = 0; i = 97 && UnicodeChar = 110 && UnicodeChar = 65 && UnicodeChar = 78 && UnicodeChar <= 90) //对字符进行解密 UnicodeChar = UnicodeChar - 13; EncodedText = EncodedText + (char)UnicodeChar; //得到加密或解密字符串 return EncodedText; //返回加密或解密后的字符串 秘 笈心法 心法领悟573:如何在字符串中查找指定字符? 在字符串中查找指定字符时,可以先将字符串显示在richTextBox 控件中,然后利用richTextBox 类的Find 方法在该控件中查找指定字符。在字符串中查找指定字符的代码如下: 第19章 加密与解密技术 M_int_index = richTextBox1.Find(textBox1.Text.Trim(), M_int_index, RichTextBoxFinds.MatchCase); if (M_int_index == -1) MessageBox.Show("没有要查找的字符串", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); M_int_index = 0; M_int_index = M_int_index + textBox1.Text.Trim().Length; richTextBox1.Focus(); 实例574 使用恺撒密码 算法 加密密码 光盘位置:光盘\MR\19\574 趣味指数: 实 例说明 恺撒密码据传是古罗马恺撒大帝用来保护重要军情的加密系统,它 是一种置换密码,通过将字母顺序推后起到加密作用。例如,将字母顺 序推后3 位,字母A 将被推作为字母D,字母B 将被推作字母E。本实 例使用C#实现了恺撒加密的 算法 ,实例运行效果如图19.4 所示。 关 键技术 本实例实现时主要用到了string 类的ToCharArray 方法和Convert 类的ToChar 方法,下面分别对它们进行 详细介绍。 (1)string类的ToCharArray 方法 string类的ToCharArray 方法用来将字符串中的字符复制到Unicode 字符数组,该方法有两种重载形式,本 实例中用到的它的重载形式如下: public char[] ToCharArray() 返回值:元素为此字符串的各字符的Unicode 字符数组。如果此字符串是空字符串,则返回的数组为空且 长度为零。 (2)Convert 类的ToChar 方法 Convert 类的ToChar 方法用来将指定的值转换为Unicode 字符,该方法为可重载方法,本实例中用到的它 的重载形式如下: public static char ToChar(int value) value:32 位有符号整数。 返回值:等效于value 的值的Unicode 字符。 设 计过程 (1)打开Visual Studio 2008开发 环境 ,新建一个Windows窗体应用程序,并将其命名为CaesarArithmetic。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体中添加两个TextBox 控件,分别用来输入 要加密的数据和显示加密后的字符串;添加一个Button 控件,用来使用恺撒密码 算法 对输入的数据进行加密。 (3)程序主要代码如下: public int AscII(string str) //获取字符的ASCII 码 byte[] array = new byte[1]; //创建字节数组 array = System.Text.Encoding.ASCII.GetBytes(str); //为字节数组赋值 int asciicode = (short)(array[0]); //获取字节数组的第一项 return asciicode; //返回字节数组的第一项 图19.4 使用恺撒密码 算法 加密密码 C#开发实战1200 例(第II卷) public string Caesar(string str) //凯撒加密 算法 的实现 char[] c = str.ToCharArray(); //创建字符数组 string strCaesar = ""; //定义一个变量,用来存储加密后的字符串 for (int i = 0; i < str.Length; i++) //遍历字符串中的每一个字符串 string ins = c[i].ToString(); //记录遍历到的字符 string outs = ""; //定义一个变量,用来记录加密后的字符串 bool isChar = "0123456789abcdefghijklmnopqrstuvwxyz".Contains(ins.ToLower()); //判断指定的字符串中是否包含遍历到的字符 bool isToUpperChar = isChar && (ins.ToUpper() == ins); //判断遍历到的字符是否是大写 ins = ins.ToLower(); //将遍历到的字符转换为小写 if (isChar) //判断指定的字符串中是否包含遍历到的字符 int offset = (AscII(ins) + 5 - AscII("a")) % (AscII("z") - AscII("a") + 1); //获取字符的ASCII 码 outs = Convert.ToChar(offset + AscII("a")).ToString(); //转换为字符并记录 if (isToUpperChar) //判断是否大写 outs = outs.ToUpper(); //全部转换为大写 outs = ins; //记录遍历的字符 strCaesar += outs; //添加到加密字符串中 return strCaesar; //返回加密后的字符串 秘 笈心法 心法领悟574:如何将新字符串添加到已有字符串中? 将新字符串添加到已有字符串中时,可以先声明一个StringBuilder类对象,以指定已有字符串的长度可变, 然后利用该对象的Append方法在字符串中添加指定字符串。将新字符串添加到已有字符串的代码如下: StringBuilder strbuilder = new StringBuilder(textBox1.Text.Trim()); strbuilder.Append(textBox2.Text.Trim()); textBox3.Text = strbuilder.ToString(); 实例575 对数据报进行加密保障通信安全 光盘位置:光盘\MR\19\575 趣味指数: 实 例说明 网络传输数据时,有时候传输信息容易被不法分子截获而 用作其他用途。这样,如果传输的数据中包含有重要秘密,将 会造成非常严重的后果。为了防止这种情况的发生,可以对网 络中传输的数据进行加密,用户接收到数据后再进行解密查看, 这样可以更好地保障网络通信安全。运行本实例,首先设置端 口号,然后在窗体左下方的文本框中输入聊天信息,单击“发 送”按钮,向局域网中发送聊天信息,同时在右侧的“数据传 输信息”栏中显示数据报的发送、接收及丢失情况。实例运行 效果如图19.5 所示。 关 键技术 本实例获取数据报信息时主要用到IPGlobalProperties和UdpStatistics类,而在对数据报加密时用到DESCrypto 图19.5 对数据报进行加密保障通信安全 第19章 加密与解密技术 ServiceProvider 和CryptoStream 类,其中DESCryptoServiceProvider 继承于DES 类。下面对本实例中用到的关 键技术进行详细讲解。 (1)IPGlobalProperties 类 IPGlobalProperties 类提供有关本地计算机的网络连接的信息,本实例中用到它的GetIPGlobalProperties 和 GetUdpIPv4Statistics 方法,下面分别进行介绍。 GetIPGlobalProperties 为静态方法,主要用来获取一个对象,该对象提供有关本地计算机的网络连接和通信 统计数据的信息,其语法格式如下: public static IPGlobalProperties GetIPGlobalProperties() 返回值:IPGlobalProperties 对象,该对象包含有关本地计算机的信息。 GetUdpIPv4Statistics 方法主要用来提供本地计算机的用户数据报协议/Internet 协议版本4 (UDP/IPv4)统 计数据,其语法格式如下: public abstract UdpStatistics GetUdpIPv4Statistics() 返回值:UdpStatistics 对象,提供本地计算机的UDP/IPv4通信统计数据。 例如,本实例中创建IPGlobalProperties 对象,及调用其GetUdpIPv4Statistics 方法创建UdpStatistics 对象的 代码如下: IPGlobalProperties NetInfo = IPGlobalProperties.GetIPGlobalProperties(); UdpStatistics myUdpStat = null; myUdpStat = NetInfo.GetUdpIPv4Statistics(); (2)UdpStatistics类 UdpStatistics 类提供用户数据报协议(UDP)统计数据,本实例中主要用到其DatagramsSent 属性、 DatagramsReceived属性和IncomingDatagramsDiscarded 属性,其中,DatagramsSent 属性用来获取已发送的用户 数据报协议(UDP)数据报的数量,DatagramsReceived 属性用来获取已接收的用户数据报协议(UDP)数据报 的数量,IncomingDatagramsDiscarded 属性用来获取已收到但因端口错误而丢弃的用户数据报协议(UDP)数据 报的数量。 例如,本实例中初始化已发送、已接收和丢失数据报的实现代码如下: SendNum1 = Int32.Parse(myUdpStat.DatagramsSent.ToString()); //记录发送的数据报 ReceiveNum1 = Int32.Parse(myUdpStat.DatagramsReceived.ToString()); //记录接收的数据报 DisNum1 = Int32.Parse(myUdpStat.IncomingDatagramsDiscarded.ToString()); //记录丢失的数据报 说明:IPGlobalProperties 类和UdpStatistics 类位于System.Net.NetworkInformation 命名空间下。 (3)DES 类 DES 类表示所有DES 实现都必须从中派生的数据加密标准(DES) 算法 的基类,其CreateEncryptor 方法和 CreateDecryptor 方法分别用来加密和解密。 CreateEncryptor 方法使用指定的Key属性和初始化向量(IV)创建对称加密器对象,其语法格式如下: public abstract ICryptoTransform CreateEncryptor(byte[] rgbKey,byte[] rgbIV) rgbKey:用于对称 算法 的密钥。 rgbIV:用于对称 算法 的初始化向量。 返回值:对称加密器对象。 CreateDecryptor 方法使用指定的Key属性和初始化向量(IV)创建对称解密器对象,其语法格式如下: public abstract ICryptoTransform CreateDecryptor(byte[] rgbKey,byte[] rgbIV) rgbKey:用于对称 算法 的密钥。 rgbIV:用于对称 算法 的初始化向量。 返回值:对称解密器对象。 C#开发实战1200 例(第II卷) (4)CryptoStream 类 CryptoStream 类定义将数据流链接到加密转换的流,其构造函数的语法格式如下: public CryptoStream(Stream stream,ICryptoTransform transform,CryptoStreamMode mode) stream:对其执行加密转换的流。 transform:要对流执行的加密转换。 mode:CryptoStreamMode 枚举值之一,CryptoStreamMode 枚举值及说明如表19.2 所示。 表19.2 CryptoStreamMode枚举值及说明 枚 举 值 说 明 Read 对加密流的读访问 Write 对加密流的写访问 另外,在向加密或解密流中写入数据时用到CryptoStream 类的Write 方法,该方法将一个字节序列写入当 前CryptoStream,并将流中的当前位置提升写入的字节数,其语法格式如下: public override void Write(byte[] buffer,int offset,int count) buffer:字节数组,此方法将count 个字节从buffer 复制到当前流。 offset:buffer 中的字节偏移量,从此偏移量开始将字节复制到当前流。 count:要写入当前流的字节数。 说明:DES 类和CryptoStream 类位于System.Security.Cryptography 命名空间下。 设 计过程 (1)打开Visual Studio 2008开发 环境 ,新建一个Windows窗体应用程序,并将其命名为EncryptDataReport。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体中添加两个RichTextBox 控件,分别用来 输入聊天信息和显示聊天信息;添加4 个TextBox 控件,分别用来输入端口号和显示已发送数据报、已接收数 据报、丢失数据报;添加4 个Button 控件,分别用来执行设置端口号、发送聊天信息、清空聊天信息和关闭应 用程序操作。 (3)程序主要代码如下。 Frm_Main 窗体的后台代码中,首先创建程序所需要的.NET 对象及公共变量,代码如下: #region 定义全局对象及变量 private IPEndPoint Server; //服务器端 private IPEndPoint Client; //客户端 private Socket mySocket; //套接字 private EndPoint ClientIP; //IP地址 byte[] buffer, data; //接收缓存 bool blFlag = true; //标识是否第一次发送信息 bool ISPort = false; //判断端口打开 int SendNum1, ReceiveNum1, DisNum1; //记录窗体加载时的已发送\已接收\丢失的数据报 int SendNum2, ReceiveNum2, DisNum2; //记录当前已发送\已接收\丢失的数据报 int SendNum3, ReceiveNum3, DisNum3; //缓存已发送\已接收\丢失的数据报 int port; //端口号 #endregion Frm_Main 窗体加载时,初始化已发送、已接收和丢失的数据报,并使用全局变量记录,实现代码如下: //初始化已发送、已接收和丢失的数据报 private void Form1_Load(object sender, EventArgs e) if (blFlag == true) IPGlobalProperties NetInfo = IPGlobalProperties.GetIPGlobalProperties(); //创建一个IPGlobalProperties 对象 UdpStatistics myUdpStat = null; //声明UdpStatistics 对象 myUdpStat = NetInfo.GetUdpIPv4Statistics(); //创建UdpStatistics 对象 第19章 加密与解密技术 SendNum1 = Int32.Parse(myUdpStat.DatagramsSent.ToString()); //记录发送的数据报 ReceiveNum1 = Int32.Parse(myUdpStat.DatagramsReceived.ToString()); //记录接收的数据报 DisNum1 = Int32.Parse(myUdpStat.IncomingDatagramsDiscarded.ToString()); //记录丢失的数据报 单击“设置”按钮,使用指定的端口号连接服务器端与客户端,并开始接收消息。“设置”按钮的Click 事件的代码如下: private void button4_Click(object sender, EventArgs e) //设置端口号 port = Convert.ToInt32(textBox4.Text); //记录端口号 CheckForIllegalCrossThreadCalls = false; //指定线程中可以调用窗体的控件对象 buffer = new byte[1024]; data = new byte[1024]; Server = new IPEndPoint(IPAddress.Any, port); //创建服务器端 Client = new IPEndPoint(IPAddress.Broadcast, port); //创建客户端 ClientIP = (EndPoint)Server; //获取服务器端IP 地址 //创建Socket 对象 mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //设置Socket 网络操作 mySocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1); mySocket.Bind(Server); //绑定服务器端 //开始接收消息 mySocket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref ClientIP, new AsyncCallback(StartLister), null); ISPort = true; //打开指定端口号 catch { } 单击“发送”按钮,首先判断是否有打开的端口,如果没有,弹出提示信息,否则根据发送和接收的消息 计算已发送、已接收和丢失的数据报,并显示在相应的文本框中,然后使用DES对要发送的消息进行加密发送。 “发送”按钮的Click事件的代码如下: //发送信息 private void button2_Click(object sender, EventArgs e) if (ISPort == true) //判断是否有打开的端口号 IPGlobalProperties NetInfo = IPGlobalProperties.GetIPGlobalProperties(); UdpStatistics myUdpStat = null; myUdpStat = NetInfo.GetUdpIPv4Statistics(); if (blFlag == false) //非第一次发送 SendNum2 = Int32.Parse(myUdpStat.DatagramsSent.ToString()); ReceiveNum2 = Int32.Parse(myUdpStat.DatagramsReceived.ToString()); DisNum2 = Int32.Parse(myUdpStat.IncomingDatagramsDiscarded.ToString()); textBox1.Text = Convert.ToString(SendNum2 - SendNum3); textBox2.Text = Convert.ToString(ReceiveNum2 - ReceiveNum3); textBox3.Text = Convert.ToString(DisNum2 - DisNum3); SendNum2 = Int32.Parse(myUdpStat.DatagramsSent.ToString()); ReceiveNum2 = Int32.Parse(myUdpStat.DatagramsReceived.ToString()); DisNum2 = Int32.Parse(myUdpStat.IncomingDatagramsDiscarded.ToString()); SendNum3 = SendNum2; //记录本次的发送数据报 ReceiveNum3 = ReceiveNum2; //记录本次的接收数据报 DisNum3 = DisNum2; //记录本次的丢失数据报 if (blFlag == true) //第一次发送 textBox1.Text = Convert.ToString(SendNum2 - SendNum1); textBox2.Text = Convert.ToString(ReceiveNum2 - ReceiveNum1); textBox3.Text = Convert.ToString(DisNum2 - DisNum1); blFlag = false; C#开发实战1200 例(第II卷) catch (Exception ex) MessageBox.Show(ex.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information); string str = EncryptDES(rtbSend.Text, "mrsoftxk"); //加密要发送的信息 data = Encoding.Unicode.GetBytes(str); mySocket.SendTo(data, data.Length, SocketFlags.None, Client); //发送消息 rtbSend.Text = ""; MessageBox.Show("请首先打开端口!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); button4.Focus(); 上面的代码中用到了EncryptDES 方法,该方法为自定义的、返回值类型为string 的方法,主要用来使用 DES 加密数据报,它有两个string 类型的参数,分别用来表示待加密的字符串和加密密钥,返回值为加密后的 字符串。EncryptDES 方法的实现代码如下: #region DES 加密字符串 ///DES 加密字符串 ///待加密的字符串 ///加密密钥,要求为8 位 ///加密成功返回加密后的字符串,失败返回源字符串 public string EncryptDES(string str, string key) byte[] rgbKey = Encoding.UTF8.GetBytes(key.Substring(0, 8)); //将加密密钥转换为字节数组 byte[] rgbIV = Keys; //记录原始密钥数组 byte[] inputByteArray = Encoding.UTF8.GetBytes(str); //将加密字符串转换为字节数组 DESCryptoServiceProvider myDES = new DESCryptoServiceProvider(); //创建加密对象 MemoryStream MStream = new MemoryStream(); //创建内存数据流 //创建加密流对象 CryptoStream CStream = new CryptoStream(MStream, myDES.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write); CStream.Write(inputByteArray, 0, inputByteArray.Length); //向加密流中写入数据 CStream.FlushFinalBlock(); //释放加密流对象 return Convert.ToBase64String(MStream.ToArray()); //返回内存流中的数据 catch return str; #endregion 秘 笈心法 心法领悟575:如何根据标点符号分行? 根据标点符号分行时,首先要使用string 类的Split 方法分割字符串,然后再通过“\n”回车换行符将分割 的字符串换行显示。根据标点符号分行的代码如下: string oldstr = textBox1.Text.Trim(); string[] newstr = oldstr.Split('。'); for (int i = 0; i < newstr.Length; i++) if (richTextBox1.Text == "") richTextBox1.Text = newstr[i].ToString(); richTextBox1.Text += "\n" + newstr[i].ToString(); 第19章 加密与解密技术 实例576 使用one-time pad 算法 加密数据 光盘位置:光盘\MR\19\576 趣味指数: 实 例说明 在密码学里,有一种理想的加密方案,叫做一次一密乱码本,即 one-time pad 算法 ,该 算法 是最安全的加密 算法 ,双方一旦安全交换 了密钥,之后交换信息的过程就可以保证绝对安全。本实例使用C# 实现了one-time pad 加密 算法 ,实例运行效果如图19.6 所示。 注意:程序中使用one-time pad 算法 时,一定要保证密钥和密文 的长度是一样的。 关 键技术 本实例在实现one-time pad 加密 算法 时,主要用到了Encoding 类的GetBytes 方法和GetString 方法,下面 分别对它们进行详细介绍。 (1)Encoding 类的GetBytes方法 Encoding 类表示字符编码,其GetBytes方法主要用来将一组字符编码为一个字节序列,该方法为可重载方 法,本实例中用到的它的重载形式如下: public virtual byte[] GetBytes(string s) s:字符串。 返回值:一个字节数组,包含对指定的字符集进行编码的结果。 说明:Encoding 类位于System.Text 命名空间下。 (2)Encoding 类的GetString方法 Encoding 类的GetString方法主要用来将一个字节序列解码为一个字符串,该方法为可重载方法,本实例中 用到的它的重载形式如下: public virtual string GetString(byte[] bytes) bytes:包含要解码的字节序列的字节数组。 返回值:包含指定字节序列解码结果的字符串。 设 计过程 (1) 打开Visual Studio 2008开发 环境 ,新建一个Windows窗体应用程序,并将其命名为OneTimePadArithmetic。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体中添加4 个TextBox 控件,分别用来输入 要加密的数据和密钥,以及显示加密后的数据和解密后的数据;添加两个Button控件,分别用来实现使用one-time pad 算法 加密数据和解密数据的功能。 (3)程序主要代码如下。 在Frm_Main 窗体中输入要加密的数据和密钥后,单击“加密”按钮,使用one-time pad 算法 对输入的数据 进行加密,实现代码如下: private void button1_Click(object sender, EventArgs e) textBox2.Text = ""; //清空文本框 Encoding encoding = Encoding.Default; //获取字符编码 byte[] btData = encoding.GetBytes(textBox1.Text); //将要加密的数据转换为字节数组 byte[] btKey = encoding.GetBytes(textBox4.Text); //将密钥转换为字节数组 图19.6 使用one-time pad 算法 加密数据 C#开发实战1200 例(第II卷) if (btData.Length == btKey.Length) //判断长度是否相等 byte[] btEncrypt = Encrypt(btData, btKey); //加密数据 for (int i = 0; i < btEncrypt.Length; i++) //遍历加密后的字节数组 textBox2.Text += btEncrypt[i]; //显示在文本框中 上面的代码中用到了Encrypt 方法,该方法为自定义的、返回值类型为byte[]的方法,主要用来对指定的数 据使用one-time pad 算法 进行加密。Encrypt方法的实现代码如下: public static byte[] Encrypt(byte[] btData, byte[] btKey) if (btKey.Length != btData.Length) //判断长度是否相等 MessageBox.Show("请确保要加密数据的长度与密钥的长度一致!"); byte[] btResult = new byte[btData.Length]; //声明一个字节数组,用来存储加密数据 for (int i = 0; i < btResult.Length; ++i) //遍历字节数组 btResult[i] = (byte)(btKey[i] ^ btData[i]); //为字节数组赋值 return btResult; //返回得到的加密数据 单击“解密”按钮,调用Encrypt 方法对加密过的数据进行逆向加密,并返回一个byte[]数组,然后使用 Encoding 类的GetString方法从该数组中获取解密字符串。“解密”按钮的Click事件的代码如下: private void button2_Click(object sender, EventArgs e) Encoding encoding = Encoding.Default; //获取字符编码 byte[] btData = encoding.GetBytes(textBox1.Text); //将要加密的数据转换为字节数组 byte[] btKey = encoding.GetBytes(textBox4.Text); //将密钥转换为字节数组 if (btData.Length == btKey.Length) //判断长度是否相等 byte[] btDecrypt = Encrypt(Encrypt(btData, btKey), btKey); //解密数据 textBox3.Text = encoding.GetString(btDecrypt); //将解密后的字节数组转换为字符串并显示 秘 笈心法 心法领悟576:如何在字符串中添加多个空格? 开发程序时,有时会根据需要在字符串中添加一些空格,这时可以使用string 类的Insert方法,该方法可以 在字符串中的指定位置插入一个新的字符串(包括空格)。在字符串中添加空格的代码如下: textBox3.Text = textBox1.Text.Insert(Convert.ToInt32(textBox2.Text.Trim()), " "); 实例577 使用伪 随机 数加密技术加密用户登录密码 光盘位置:光盘\MR\19\577 趣味指数: 实 例说明 为了保障用户登录密码的安全,本实例使用伪 随机 数技术对用 户的登录密码进行加密,运行本实例,当用户在“登录密码”文本 框中输入登录密码时,程序会自动将使用过伪 随机 数加密技术加密 过的登录密码显示在下面的“加密密码”文本框中,单击“登录” 按钮,程序对“加密密码”文本框中的加密数据进行解密,然后再 与用户输入的登录密码相比较,如果相同,则登录成功;否则,登 录失败。实例运行效果如图19.7 所示。 图19.7 使用伪 随机 数加密技术 加密用户登录密码 第19章 加密与解密技术 关 键技术 本实例对用户登录密码加密时用到伪 随机 数加密技术,伪 随机 数加密技术实质上就是通过伪 随机 数序列使 登录密码字符串的字节值发生变化而产生密文,由于相同的初值能得到相同的 随机 数序列,因此,可以采用同 样的伪 随机 数序列来对密文进行解密。产生伪 随机 数时主要用到Random 类,该类表示伪 随机 数生成器,它是 一种能够产生满足某些 随机 性统计要求的数字序列的设备,其Next方法用来返回 随机 数,语法格式如下: public virtual int Next(int maxValue) maxValue:要生成的 随机 数的上界( 随机 数不能取该上界值),maxValue 必须大于等于零。 返回值:大于等于零且小于maxValue 的32 位带符号整数,即返回值的范围通常包括零但不包括 maxValue;不过,如果maxValue 等于零,则返回maxValue。 设 计过程 (1)打开Visual Studio 2008开发 环境 ,新建一个Windows窗体应用程序,并将其命名为PRanDataEncrypt。 (2)更改默认窗体Form1 的Name属性为Frm_Main,在该窗体中添加3 个TextBox 控件,分别用来输入 登录用户、登录密码和显示加密密码;添加两个Button 控件,分别用来执行用户登录和清空文本框操作。 (3)程序主要代码如下。 Frm_Main 窗体的后台代码中,首先定义加密用户密码所用的伪 随机 数,代码如下: //定义加密用户密码所用的伪 随机 数 private string randStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"; 当在“登录密码”文本框中输入登录密码时,实时将使用伪 随机 数加密过的登录密码显示在“加密密码” 文本框中,实现代码如下: private void textBox2_TextChanged(object sender, EventArgs e) textBox3.Text = EncryptPwd(textBox2.Text); //显示加密后的用户登录密码 上面的代码中用到EncryptPwd 方法,该方法为自定义的、返回值类型为string 的方法,主要用来使用伪随 机数技术加密用户登录密码,它有一个参数,用来表示用户登录密码。EncryptPwd 方法的实现代码如下: /// 使用伪 随机 数加密用户登录密码 /// 用户登录密码 /// 加密后的用户登录密码 private string EncryptPwd(string str) byte[] btData = Encoding.Default.GetBytes(str); //将登录密码转换为字节数组 int j, k, m; int len = randStr.Length; //记录伪 随机 数长度 StringBuilder sb = new StringBuilder(); //创建StringBuilder对象 Random rand = new Random(); //创建Random 对象 for (int i = 0; i < btData.Length; i++) j = (byte)rand.Next(6); //产生伪 随机 数 btData[i] = (byte)((int)btData[i] ^ j); //使用伪 随机 数对密码字节数组进行移位 k = (int)btData[i] % len; m = (int)btData[i] / len; m = m * 8 + j; sb.Append(randStr.Substring(k, 1) + randStr.Substring(m, 1)); //组合加密字符串 return sb.ToString(); //返回生成的加密字符串 单击“登录”按钮,判断“加密密码”文本框是否为空。如果不为空,调用DecryptPwd 方法解密“加密 密码”文本框中的字符串;然后使用解密后的字符串与“登录密码”文本框中的字符串相比较,如果相同,则 用户登录成功;否则,弹出提示信息。“登录”按钮的Click事件代码如下: C#开发实战1200 例(第II卷) private void button1_Click(object sender, EventArgs e) if (textBox3.Text != "") if (DecryptPwd(textBox3.Text) == textBox2.Text) //对加密过的登录密码进行解密 MessageBox.Show("用户登录成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); MessageBox.Show("用户密码错误!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); 上面的代码中用到了DecryptPwd 方法,该方法为自定义的、返回值类型为string 的方法,主要用来解密用 户登录密码,它有一个参数,主要用来表示经过加密的用户登录密码。DecryptPwd 方法的实现代码如下: /// 解密用户登录密码 /// 经过加密的用户登录密码 /// 解密后的用户登录密码 private string DecryptPwd(string str) int j, k, m, n = 0; int len = randStr.Length; //获取伪 随机 数长度 byte[] btData = new byte[str.Length / 2]; //定义一个字节数组,并指定长度 for (int i = 0; i < str.Length; i += 2) //对登录密码进行解密 k = randStr.IndexOf(str[i]); m = randStr.IndexOf(str[i + 1]); j = m / 8; m = m - j * 8; btData[n] = (byte)(j * len + k); btData[n] = (byte)((int)btData[n] ^ m); return Encoding.Default.GetString(btData); //返回解密后的登录密码 catch { return ""; } 秘 笈心法 心法领悟577:如何将字符串颠倒输出? 颠倒输出字符串时,可以先将要输出的字符串保存到一个char 类型的数组中,然后使用Array 类的Reverse 方法。将字符串颠倒输出的代码如下: string str1 = textBox1.Text.Trim(); char[] charstr = str1.ToCharArray(); Array.Reverse(charstr); string str2 = new string(charstr); textBox2.Text = str2; 实例578 以XML格式导入导出密钥 光盘位置:光盘\MR\19\578 趣味指数: 实 例说明 本实例主要实现以XML 格式导入导出密钥,从而实现对数据进行加密和解密的功能。运行本实例,首先 在窗体中显示生成的公钥和私钥,然后输入明文数据,单击“加密”按钮,对输入的明文数据进行加密;单击 “解密”按钮,对加密后的数据进行解密。实例运行效果如图19.8 所示。 第19章 加密与解密技术 图19.8 以XML 格式导入导出密钥 关 键技术 本实例实现时主要用到了 RSA CryptoServiceProvider 类的ToXmlString方法、Encrypt 方法和Decrypt 方法, 下面对本实例中用到的关键技术进行详细讲解。 (1) RSA CryptoServiceProvider 类的ToXmlString方法 RSA CryptoServiceProvider 类用来使用加密服务提供程序(CSP)提供的 RSA 算法 的实现执行不对称加密和 解密,其ToXmlString 方法主要用来创建并返回包含当前 RSA 对象的密钥的XML 字符串,该方法的语法格式 public override string ToXmlString(bool includePrivateParameters) includePrivateParameters:true 表示同时包含 RSA 公钥和私钥,false 表示仅包含公钥。 返回值:包含当前 RSA 对象的密钥的XML字符串。 说明: RSA CryptoServiceProvider 类位于System.Security.Cryptography 命名空间下。 (2) RSA CryptoServiceProvider 类的Encrypt方法 该方法主要使用 RSA 算法 对数据进行加密,其语法格式如下: public byte[] Encrypt(byte[] rgb,bool fOAEP) rgb:要加密的数据。 fOAEP:如果为true,则使用OAEP 填充 (仅在运行Microsoft Windows XP 或更高版本的计算机上可用) 执行直接的 RSA 加密;如果为false,则使用PKCS#1 1.5 版 填充 。 返回值:字节数组,表示已加密的数据。 (3) RSA CryptoServiceProvider 类的Decrypt方法 该方法主要使用 RSA 算法 对数据进行解密,其语法格式如下: public byte[] Decrypt(byte[] rgb,bool fOAEP) rgb:要解密的数据。 fOAEP:如果为true,则使用OAEP 填充 (仅在运行Microsoft Windows XP 或更高版本的计算机上可用) 执行直接的 RSA 解密;如果为false,则使用PKCS#1 1.5 版 填充 。 返回值:字节数组,表示已解密的数据,它是加密前的原始纯文本。 设 计过程 (1)打开Visual Studio 2008 开发 环境 ,新建一个Windows窗体应用程序,并将其命名为KeyToXML。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体中添加5 个TextBox 控件,分别用来显示 C#开发实战1200 例(第II卷) 公钥、显示私钥、输入明文数据、显示加密后的数据和显示解密后的数据;添加两个Button 控件,分别用来执 行数据加密和解密操作。 (3)程序主要代码如下。 在Frm_Main 窗体的后台代码中,首先创建 RSA CryptoServiceProvider 对象,并且定义一个字节数组,用来 存储临时数据,代码如下: RSA CryptoServiceProvider RSA Crypto = new RSA CryptoServiceProvider(); //创建 RSA 算法 加密解密对象 byte[] M_bt_Data; //定义一个字节数组,用来存储临时数据 Frm_Main 窗体加载时,在文本框中显示程序自动生成的公钥和私钥数据,代码如下: private void Frm_Main_Load(object sender, EventArgs e) this.textBox1.Text = RSA Crypto.ToXmlString(true); //显示生成的公钥 this.textBox2.Text = RSA Crypto.ToXmlString(false); //显示生成的私钥 当用户输入明文数据之后,单击“加密”按钮,调用 RSA CryptoServiceProvider 类的Encrypt方法对数据进 行加密,并且使用Encoding 类的UTF8 编码方式的GetString 方法得到加密后的数据,显示在文本框中。“加密” 按钮的Click事件代码如下: private void button1_Click(object sender, EventArgs e) if (textBox3.Text != "") //判断是否输入了要加密的数据 byte[] P_bt_Encrypt = Encoding.UTF8.GetBytes(textBox3.Text); //将要加密的数据转换为字节数组 M_bt_Data = RSA Crypto.Encrypt(P_bt_Encrypt, false); //加密数据 textBox4.Text = Encoding.UTF8.GetString(M_bt_Data); //显示加密数据 单击“解密”按钮,调用 RSA CryptoServiceProvider 类的Decrypt方法对加密过的数据进行解密,并且使用 Encoding 类的UTF8 编码方式的GetString 方法得到解密后的数据,显示在文本框中。“解密”按钮的Click 事 件代码如下: private void button2_Click(object sender, EventArgs e) if (textBox4.Text != "") //判断是否有加密过的数据 byte[] P_bt_Decrypt = RSA Crypto.Decrypt(M_bt_Data, false); //对数据进行解密 textBox5.Text = Encoding.UTF8.GetString(P_bt_Decrypt); //显示解密数据 秘 笈心法 心法领悟578:如何判断字符串是否为日期格式? 判断字符串是否为日期格式时,可以使用正则表达式。验证日期格式的正则表达式主要有以下3 种: \b(?\d{2,4})/(?\d{1,2})/(?\d{1,2})\b \b(?\d{2,4})-(?\d{1,2})-(?\d{1,2})\b \b(?\d{2,4})年(?\d{1,2})月(?\d{1,2})日\b 实例579 以参数格式导入导出密钥 光盘位置:光盘\MR\19\579 趣味指数: 实 例说明 本实例主要实现以参数格式导入导出密钥,从而实现对数据进行加密和解密的功能。运行本实例,在窗体 第19章 加密与解密技术 中输入明文数据,单击“加密”按钮,对输入的明文数据进行加密;单击“解 密”按钮,对加密后的数据进行解密。实例运行效果如图19.9 所示。 关 键技术 本实例实现时主要用到了 RSA CryptoServiceProvider 类的ExportParameters 方法、ImportParameters 方法、Encrypt 方法和Decrypt 方法,下面对本实例 中用到的关键技术进行详细讲解。 (1) RSA CryptoServiceProvider 类的ExportParameters 方法 该方法主要用来导出 RSA Parameters标准参数,其语法格式如下: public override RSA Parameters ExportParameters(bool includePrivateParameters) includePrivateParameters:如果要包括私有参数,则为true;否则为false。 返回值: RSA 算法 的标准参数。 (2) RSA CryptoServiceProvider 类的ImportParameters 方法 该方法主要用来导入指定的 RSA Parameters标准参数,其语法格式如下: public override void ImportParameters( RSA Parameters parameters) parameters: RSA 算法 的标准参数。 说明:关于 RSA CryptoServiceProvider 类的Encrypt 方法和Decrypt 方法的详细讲解,请参见实例578 中的 关键技术。 设 计过程 (1)打开Visual Studio 2008 开发 环境 ,新建一个Windows窗体应用程序,并将其命名为KeyToParameter。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体中添加3 个TextBox 控件,分别用来输入 明文数据、显示加密后的数据和解密后的数据;添加两个Button 控件,分别用来执行数据加密和解密操作。 (3)程序主要代码如下。 Frm_Main 窗体的后台代码中,首先创建 RSA CryptoServiceProvider 对象和 RSA Parameters 标准参数对象, 并且定义一个字节数组,用来存储临时数据,代码如下: RSA CryptoServiceProvider RSA Crypto; //声明 RSA 算法 加密解密对象 RSA Parameters RSA Parame; //声明 RSA Parameters 参数对象 byte[] M_bt_Data; //定义一个字节数组,用来存储临时数据 在Frm_Main 窗体的构造函数中,调用 RSA CryptoServiceProvider 类的ImportParameters 方法导入 RSA Parameters标准参数,实现代码如下: public Frm_Main() InitializeComponent(); RSA Crypto = new RSA CryptoServiceProvider(); //初始化 RSA 算法 加密解密对象 RSA Parame = RSA Crypto.ExportParameters(true); //初始化 RSA Parameters 参数 RSA Crypto.Clear(); //清空 RSA CryptoServiceProvider 对象 RSA Crypto = new RSA CryptoServiceProvider(); //初始化 RSA 算法 加密解密对象 RSA Crypto.ImportParameters( RSA Parame); //导入密钥 当用户输入明文数据之后,单击“加密”按钮,调用 RSA CryptoServiceProvider 类的Encrypt方法对数据进 行加密,并且使用Encoding 类的UTF8 编码方式的GetString 方法得到加密后的数据,显示在文本框中。“加密” 按钮的Click事件代码如下: private void button1_Click(object sender, EventArgs e) if (textBox1.Text != "") //判断是否输入了要加密的数据 图19.9 以参数格式导入导出密钥 C#开发实战1200 例(第II卷) byte[] P_bt_Encrypt = Encoding.UTF8.GetBytes(textBox1.Text); //将要加密的数据转换为字节数组 M_bt_Data = RSA Crypto.Encrypt(P_bt_Encrypt, false); //加密数据 textBox2.Text = Encoding.UTF8.GetString(M_bt_Data); //显示加密数据 单击“解密”按钮,调用 RSA CryptoServiceProvider 类的Decrypt方法对加密过的数据进行解密,并且使用 Encoding 类的UTF8 编码方式的GetString 方法得到解密后的数据,显示在文本框中。“解密”按钮的Click 事 件代码如下: private void button2_Click(object sender, EventArgs e) if (textBox2.Text != "") //判断是否有加密过的数据 byte[] P_bt_Decrypt = RSA Crypto.Decrypt(M_bt_Data, false); //对数据进行解密 textBox3.Text = Encoding.UTF8.GetString(P_bt_Decrypt); //显示解密数据 秘 笈心法 心法领悟579:巧截字符串中的数字。 截取字符串中的数字时,可以先使用CharEnumerator 对象的MoveNext 方法循环访问字符串中的每个字符, 并将字符用System.Text.Encoding 类中ASCII 编码方式的GetBytes 方法进行编码,然后判断经过编码之后的字符 的ASCII码值是否介于48和57之间,如果是,则将其显示在textBox文本框中。截取字符串中数字的代码如下: CharEnumerator CEnumerator = textBox1.Text.GetEnumerator(); while (CEnumerator.MoveNext()) byte[] array = new byte[1]; array = System.Text.Encoding.ASCII.GetBytes(CEnumerator.Current.ToString()); int asciicode = (short)(array[0]); if (asciicode >= 48 && asciicode <= 57) textBox2.Text += CEnumerator.Current.ToString(); 19.2 文件的加密与解密 实例580 文本文件加密与解密 光盘位置:光盘\MR\19\580 趣味指数: 实 例说明 在本实例的窗体中,首先选择要加密或解密的文本文件,然后单击“加 密”或“解密”按钮对文本文件进行加密或解密。实例运行效果如图19.10 关 键技术 本实例实现时主要用到了System.Security.Cryptography命名空间下的 RijndaelManaged 类的CreateDecryptor 方法、CreateEncryptor 方法和CryptoStream 类的Write 方法,下面对本实 例中用到的关键技术进行详细讲解。 (1)RijndaelManaged 类 该类是访问System.Security.Cryptography.Rijndael 对称加密 算法 的托管版本,其语法格式如下: public sealed class RijndaelManaged : Rijndael 图19.10 文本文件加密与解密 第19章 加密与解密技术 注意:此 算法 支持128、192或256 位的密钥长度。 (2)CreateDecryptor 方法 该方法位于RijndaelManaged 类中,使用指定的Key和初始化向量(IV)创建对称的Rijndael 解密器对象, 其语法格式如下: public override IcryptoTransform CreateDecryptor (byte[] rgbKey,byte[] rgbIV) rgbKey:用于对称 算法 的机密密钥。 rgbIV:用于对称 算法 的IV。 返回值:对称的Rijndael 解密器对象。 (3)CreateEncryptor 方法 该方法位于RijndaelManaged 类中,使用指定的Key和初始化向量(IV)创建对称的Rijndael 加密器对象, 其语法格式如下: public override ICryptoTransform CreateEncryptor (byte[] rgbKey,byte[] rgbIV) rgbKey:用于对称 算法 的机密密钥。 rgbIV:用于对称 算法 的IV。 返回值:对称的Rijndael 加密器对象。 说明:关于CryptoStream 类的Write 方法的详细讲解,请参见实例575中的关键技术。 设 计过程 (1) 打开Visual Studio 2008开发 环境 ,新建一个Windows窗体应用程序,并将其命名为EncryptTextFileOne。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体中添加一个TextBox 控件,用来显示文本 文件路径;添加一个OpenFileDialog 控件,用来选择要加密或解密的文本文件;添加3 个Button 控件,用来执 行选择文本文件、加密和解密操作。 (3)程序主要代码如下。 单击“加密”按钮实现对选择的文本文件进行加密,“加密”按钮的Click事件的代码如下: private void button2_Click(object sender, EventArgs e) if (textBox1.Text == "") //若未选择要加密的文本文件 { MessageBox.Show("请选择要加密的文件"); } //如果没有选择则弹出提示 string strPath = textBox1.Text; //加密文件的路径 int intLent=strPath.LastIndexOf("\\")+1; //设置截取的起始位置 int intLong = strPath.Length; //设置截取的长度 string strName = strPath.Substring(intLent,intLong-intLent); //要加密的文件名称 int intTxt = strName.LastIndexOf("."); //设置截取的起始位置 int intTextLeng = strName.Length; //设置截取的长度 string strTxt = strName.Substring(intTxt,intTextLeng-intTxt); //取出文件的扩展名 strName = strName.Substring(0,intTxt); //加密后的文件名及路径 string strOutName = strPath.Substring(0, strPath.LastIndexOf("\\") + 1) + strName + "Out" + strTxt; //加密文件密钥 byte[] key = { 24, 55, 102, 24, 98, 26, 67, 29, 84, 19, 37, 118, 104, 85, 121, 27, 93, 86, 24, 55, 102, 24, 98, 26, 67, 29, 9, 2, 49, 69, 73, 92 }; byte[] IV ={ 22, 56, 82, 77, 84, 31, 74, 24, 55, 102, 24, 98, 26, 67, 29, 99 }; RijndaelManaged myRijndael = new RijndaelManaged(); FileStream fsOut = File.Open(strOutName, FileMode.Create, FileAccess.Write); FileStream fsIn = File.Open(strPath, FileMode.Open, FileAccess.Read); //写入加密文本文件 CryptoStream csDecrypt = new CryptoStream(fsOut, myRijndael.CreateEncryptor(key, IV), CryptoStreamMode.Write); BinaryReader br = new BinaryReader(fsIn); //创建阅读器来读加密文本 csDecrypt.Write(br.ReadBytes((int)fsIn.Length), 0, (int)fsIn.Length); //将数据写入加密文本 C#开发实战1200 例(第II卷) csDecrypt.FlushFinalBlock(); csDecrypt.Close(); //关闭CryptoStream 对象 fsIn.Close(); //关闭FileStream 对象 fsOut.Close(); //关闭FileStream 对象 if (MessageBox.Show("加密成功!加密后的文件名及路径为:\n" + strOutName + ",是否删除源文件", "信息提示", MessageBoxButtons. YesNo) == DialogResult.Yes) File.Delete(strPath); //删除指定文件 textBox1.Text = ""; //清空文本框 }else { textBox1.Text = ""; } catch (Exception ee) //如果出现异常 MessageBox.Show(ee.Message); //输出异常信息 单击“解密”按钮实现对加密的文本文件进行解密,“解密”按钮的Click事件代码如下: private void button3_Click(object sender, EventArgs e) if (textBox1.Text == "") //若未选择要解密的文件 MessageBox.Show("请选择要解密的文件路径"); //如果没有选择则弹出提示 string strPath = textBox1.Text; //加密文件的路径 int intLent = strPath.LastIndexOf("\\") + 1; //设置截取字符串的起始位置 int intLong = strPath.Length; //设置截取长度 string strName = strPath.Substring(intLent, intLong - intLent); //要加密的文件名称 int intTxt = strName.LastIndexOf("."); //截取字符串的起始位置 int intTextLeng = strName.Length; //截取长度 strName = strName.Substring(0, intTxt); //获取扩展名 if (strName.LastIndexOf("Out") != -1) strName = strName.Substring(0, strName.LastIndexOf("Out")); strName = strName + "In"; //加密后的文件名及路径 string strInName = strPath.Substring(0, strPath.LastIndexOf("\\") + 1) + strName + ".txt"; //解密文件密钥 byte[] key = { 24, 55, 102, 24, 98, 26, 67, 29, 84, 19, 37, 118, 104, 85, 121, 27, 93, 86, 24, 55, 102, 24, 98, 26, 67, 29, 9, 2, 49, 69, 73, 92 }; byte[] IV ={ 22, 56, 82, 77, 84, 31, 74, 24, 55, 102, 24, 98, 26, 67, 29, 99 }; RijndaelManaged myRijndael = new RijndaelManaged(); //创建RijndaelManaged 对象 //创建FileStream 对象 FileStream fsOut = File.Open(strPath, FileMode.Open, FileAccess.Read); CryptoStream csDecrypt = new CryptoStream(fsOut, myRijndael.CreateDecryptor(key, IV), CryptoStreamMode.Read); StreamReader sr = new StreamReader(csDecrypt); //把文件读出来 StreamWriter sw = new StreamWriter(strInName); //解密后写入一个新文件 sw.Write(sr.ReadToEnd()); sw.Flush(); sw.Close(); sr.Close(); fsOut.Close(); if (MessageBox.Show("解密成功!解密后的文件名及路径为:"+strInName+",是否删除源文件", "信息提示", MessageBoxButtons.YesNo) == DialogResult.Yes) File.Delete(strPath); //删除指定文件 textBox1.Text = ""; //清空文本框 第19章 加密与解密技术 textBox1.Text = ""; 秘 笈心法 心法领悟580:如何存储变长字符串? 在程序中存储变长字符串时,需要使用StringBuilder对象。相对于string 对象来说,StringBuilder 对象是可 变的,不用生成中间对象,因此,在连接的字符串较多或字符串长度较长时,通常都使用StringBuilder 对象。 实例581 利用图片加密文件 光盘位置:光盘\MR\19\581 趣味指数: 实 例说明 本实例在加密时,使用指定的图片生成加密密钥,然后对文本文件进 行加密;在解密时,使用加密时的图片生成解密密钥,然后对加密的文本 文件进行解密。运行本实例,首先打开一张图片,用来生成加密或解密的 密钥,然后选择要加密或解密的文本文件,最后单击“加密”或“解密” 按钮,实现对文本文件的加密或解密。实例运行效果如图19.11 所示。 关 键技术 本实例实现时主要用到了RC2CryptoServiceProvider 类、BinaryWriter 类的Write 方法、File 类的Delete 方法和Copy 方法,下面对本实例中用到 的关键技术进行详细讲解。 (1)RC2CryptoServiceProvider 类 该类定义访问RC2 算法 的加密服务提供程序(CSP)实现的包装对象,无法继承此类。 (2)BinaryWriter 类 该类以二进制形式将基元类型写入流,并支持用特定的编码写入字符串,其构造器的语法格式如下: public BinaryWriter (Stream output) output:表示输出流。 (3)BinaryWriter 类的Write 方法 该方法将一个无符号字节写入当前流,并将流的位置提升一个字节,其语法格式如下: public virtual void Write (byte value) value:表示要写入的无符号字节。 (4)File 类的Delete 方法 File 类提供用于创建、复制、删除、移动和打开文件的静态方法,并协助创建FileStream 对象,该类是个 静态类,其Delete方法用于删除指定的文件,如果指定的文件不存在,则引发异常。该方法的语法格式如下: public static void Delete (string path) path:表示要删除的文件的名称。 (5)File 类的Copy 方法 该方法将现有文件复制到新文件,不允许改写同名的文件,其语法格式如下: public static void Copy (string sourceFileName,string destFileName) 图19.11 利用图片加密文件 C#开发实战1200 例(第II卷) sourceFileName:要复制的文件。 destFileName:目标文件的名称,不能是一个目录或现有文件。 设 计过程 (1) 打开Visual Studio 2008开发 环境 ,新建一个Windows窗体应用程序,并将其命名为EncryptTextFileTwo。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体中添加一个TextBox 控件,用来显示加密 或解密文件的路径;添加一个OpenFileDialog 控件,用来选择要加密或解密的文件和打开密钥的图片;添加4 个Button 控件,分别用来执行加密、解密、打开文件和打开图片操作;添加一个PictureBox 控件,用于显示密 (3)程序主要代码如下。 单击“加密”按钮,实现利用图片对文本文件进行加密的功能,“加密”按钮的Click 事件的代码如下: private void button3_Click(object sender, EventArgs e) if (pictureBox1.ImageLocation==null) //判断是否选择了图片 { MessageBox.Show("请选择一幅图片用于加密"); return; } //如果没有选择则弹出提示 if (textBox1.Text == "") //若未选择需要加密的文件 { MessageBox.Show("请选择加密文件路径"); return; } //如果没有选择则弹出提示 //图片流 FileStream fsPic = new FileStream(pictureBox1.ImageLocation, FileMode.Open, FileAccess.Read); //加密文件流 FileStream fsText = new FileStream(textBox1.Text, FileMode.Open, FileAccess.Read); //初始化对称 算法 的密钥和向量 byte[] bykey = new byte[16]; //定义存储密钥的字节数组 byte[] byIv = new byte[8]; //定义存储向量的字节数组 fsPic.Read(bykey, 0, 16); //把图片流写入密钥缓冲区 fsPic.Read(byIv, 0, 8); //把图片流写入向量缓冲区 //临时加密文件 string strPath = textBox1.Text; //加密文件的路径 int intLent = strPath.LastIndexOf("\\") + 1; int intLong = strPath.Length; string strName = strPath.Substring(intLent, intLong - intLent); //要加密的文件名称 string strLinPath = "C:\\" + strName; //临时加密文件路径 FileStream fsOut = File.Open(strLinPath, FileMode.Create, FileAccess.Write); //开始加密,首先创建RC2CryptoServiceProvider 对象 RC2CryptoServiceProvider desc = new RC2CryptoServiceProvider(); BinaryReader br = new BinaryReader(fsText); //创建BinaryReader 对象 //创建CryptoStream 对象,用于写入临时加密文件 CryptoStream cs = new CryptoStream(fsOut, desc.CreateEncryptor(bykey, byIv), CryptoStreamMode.Write); cs.Write(br.ReadBytes((int)fsText.Length), 0, (int)fsText.Length); //写入加密流 cs.FlushFinalBlock(); cs.Flush(); cs.Close(); fsPic.Close(); fsText.Close(); fsOut.Close(); File.Delete(textBox1.Text.TrimEnd()); //删除原文件 File.Copy(strLinPath, textBox1.Text); //复制加密文件 File.Delete(strLinPath); //删除临时文件 MessageBox.Show("加密成功"); pictureBox1.ImageLocation = null; textBox1.Text = ""; catch (Exception ee) MessageBox.Show(ee.Message); 第19章 加密与解密技术 单击“解密”按钮,实现利用图片对加密的文本文件进行解密的功能,“解密”按钮的Click事件的代码如下: private void button4_Click(object sender, EventArgs e) //图片流 FileStream fsPic = new FileStream(pictureBox1.ImageLocation, FileMode.Open, FileAccess.Read); //解密文件流 FileStream fsOut = File.Open(textBox1.Text, FileMode.Open, FileAccess.Read); //初始化对称 算法 的密钥和向量 byte[] bykey = new byte[16]; //定义存储密钥的字节数组 byte[] byIv = new byte[8]; //定义存储向量的字节数组 fsPic.Read(bykey, 0, 16); //把图片流写入密钥缓冲区 fsPic.Read(byIv, 0, 8); //把图片流写入向量缓冲区 //创建临时解密文件 string strPath = textBox1.Text; //加密文件的路径 int intLent = strPath.LastIndexOf("\\") + 1; //获取不含文件名的路径长度 int intLong = strPath.Length; //获取含文件名的路径长度 //获取要解密文件的名称,即加密文件的名称 string strName = strPath.Substring(intLent, intLong - intLent); string strLinPath = "C:\\" + strName; //临时解密文件路径 FileStream fs = new FileStream(strLinPath, FileMode.Create, FileAccess.Write); //开始解密,首先创建RC2CryptoServiceProvider 对象 RC2CryptoServiceProvider desc = new RC2CryptoServiceProvider(); //创建CryptoStream 对象,用于读取加密文件 CryptoStream csDecrypt = new CryptoStream(fsOut, desc.CreateDecryptor(bykey, byIv), CryptoStreamMode.Read); BinaryReader sr = new BinaryReader(csDecrypt); //创建BinaryReader 对象 BinaryWriter sw = new BinaryWriter(fs); //创建BinaryWriter 对象 sw.Write(sr.ReadBytes(Convert.ToInt32(fsOut.Length))); //写入解密流 sw.Flush(); sw.Close(); sr.Close(); fs.Close(); fsOut.Close(); fsPic.Close(); csDecrypt.Flush(); File.Delete(textBox1.Text.TrimEnd()); //删除原文件 File.Copy(strLinPath, textBox1.Text); //复制加密文件 File.Delete(strLinPath); //删除临时文件 MessageBox.Show("解密成功"); //弹出提示信息 pictureBox1.ImageLocation = null; //清空图片 textBox1.Text = ""; //清空文本框 catch (Exception ee) //如果出现异常 MessageBox.Show(ee.Message); //输出异常 秘 笈心法 心法领悟581:如何去除字符串尾空格? 去除字符串尾空格需要使用string 类的Trim 方法,该方法用来从字符串的开始和末尾处移除空白字符的所 有匹配项。例如,下面的代码用来去掉textBox1 文本框中字符串的尾空格,并将结果显示在textBox2 文本框中: textBox2.Text = textBox1.Text.Trim(); 实例582 对文件进行加密保护 光盘位置:光盘\MR\19\582 趣味指数: 实 例说明 随着计算机的普及,文件的安全越来越重要,本实例使用C#制作了一个对文件进行加密保护的实例。运行 C#开发实战1200 例(第II卷) 本实例,选择要加密或解密的文件,用程序来判断是否是加密过的文件, 如果不是,输入加密密码,单击“加密”按钮,加密已选择的文件;如果 是,输入解密密码,单击“解密”按钮,解密选择的加密文件。实例运行 效果如图19.12 所示。 关 键技术 本实例制作对文件进行加密保护程序时,首先选择要加密或解密的文 件,并输入加密或解密密码,然后启动一个新的线程,使用输入的密码对 指定的文件进行加密或解密操作。另外,如果对文件执行的是加密操作,则加密成功后删除原文件。具体实现 过程中,主要用到了DES 类的CreateEncryptor 和CreateDecryptor 方法、CryptoStream 类的构造函数及其Write 说明:关于DES 类的CreateEncryptor 方法和CreateDecryptor 方法、CryptoStream 类的构造函数及其Write 方法的详细讲解,请参见实例575中的关键技术。 设 计过程 (1)打开Visual Studio 2008 开发 环境 ,新建一个Windows窗体应用程序,并将其命名为ProtectFile。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体中添加一个OpenFileDialog 控件,用来显 示“打开”对话框;添加两个TextBox 控件,分别用来显示选择的文件路径和输入加密、解密密码;添加3 个 Button控件,分别用来执行选择加密或解密的文件、加密文件和解密文件操作;添加一个ProgressBar控件,用 来显示加密或解密的进度。 (3)程序主要代码如下。 Frm_Main 窗体加载时,首先将加密文件 VProtect 中文注册版是新一代的软件加密保护系统,功能全面,兼容性非常好。无需修改源代码即可添加任何想要的功能。拥有多项自主创新技术,设计用来保护软件产品不被免费,减少由于盗版带来的经济损失。 软件加密保护系统 VProtect Pro 中文版软件加密保护系统 VProtect Pro 中文版 授权加密系统 支持可执行文件格式 Win32 可执行文件 (*.exe); Windows 屏幕保护程序 (*.scr); 动态链接库 (*.dll); 32位 ActiveX 控件 (*.ocx); 其他32位可执行程序; 支持的编译器: Assembly language:MASM, FASM, POASM, TASM Basic: Visual Basic, Pure Basic, Power Basic C/C++: Visual C/C++, Borland C++ builder, Intel C++, Dev C++, Digital Mars C++, MinGW Pascal: Delphi, Free Pascal D Programming language: DMD 其他编译器 支持的操作系统: 32 位 NT/2000/XP/2003/Vista/Win7/2008 Server 及其对应 64 位版本。 保护功能: 一键授权系统,无需写一行代码就可以给您的软件添加高安全性注册授权系统 原创虚拟机保护引擎(什么是虚拟机保护参考帮助文档) 原创深度虚拟化保护(深度虚拟化保护和普通保护区别参考帮助文档) 随机 指令集 随机 填充 代码 代码乱序执行 反内存转储存 输入表加密 软件特色: 使用目前最先进的虚拟机乱序等引擎,可以阻止绝大多数人逆向分析。 执行效率 软件使用SDK,进行重点加密(如:注册逻辑,关键 算法 ,详细信息参考帮助文档)。 所以基本上不影响程序运行效率 兼容性 全面支持主流的 32/64(*) 位 Windows 操作系统,能够稳定运行于 Intel/AMD 各种 32/64 位及多核处理器;绝大多数加密后的程序均可正确运行。 注意:目前软件不支持原生的64位可执行程序加密。 实用性 自带授权系统,正常用户管理系统,黑名单,加密SDK,授权API等实用功能 分析使用Vprotect保护后的程序,将不仅仅是一项技术活,同时也会成为高强度的体力活。 虚拟机加密系统 VProtect使用了自主开发的虚拟机加密引擎。 引擎使用了: 指令逻辑拆分 指令环形效验 随机 指令 随机 Handle等技术 是目前强度最高的加密方式。 适合加密软件关键 算法 ,专利部分。 外壳加密引擎 前面介绍的虚拟机和乱序都是基于代码级的保护。 外壳保护引擎则是全局的。 VProtect外壳引擎注重通过 算法 来阻止非法修改。 外壳引擎提供以下功能 输入表加密 资源防修改 反虚拟机执行等.. 注册授权系统 VProtect不但提供了反免费,逆向分析功能,还提供了一键授权系统。 这使共享软件作者的开发周期,开发成本都得到了有效控制。 VProtect提供了完善的授权系统 多种授权方式(锁定机器码,锁定系统 语言 ,限制运行次数等) 完善的用户管理系统 黑名单系统,有效解决用户授权泄漏问题。 高安全性的 算法 RSA 2048位密钥加密) 兼容性和稳定性 VProtect注重强度的同时,也是以兼容性为首的。 只有在保证加密后程序在所有系统上都正常执行的功能才会添加到程序中。程序代码级保护使用了高效的反汇编引擎,可以识别X86构架下目前所有指令。支持多媒体,浮点等指令。 同时VProtect对各种编译器提供了很好的支持。不但支持常用的Vs,Delphi,Gcc,NASM.MASM.还原始支持国产的易 语言 。 MD5的全称是Message-Digest Algorithm 5(信息-摘要 算法 ),在90年代初由MIT Laboratory for Computer Science和 RSA Data Security Inc的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。它的作用是让大容量信息在用数字签名软件签署私人密匙前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。不管是MD2、MD4还是MD5,它们都需要获得一个 随机 长度的信息并产生一个128位的信息摘要。虽然这些 算法 的结构或多或少有些相似,但MD2的设计与MD4和MD5完全 不同 ,那是因为MD2是为8位机器做过设计优化的,而MD4和MD5却是面向32位的电脑。这三个 算法 的描述和C 语言 源代码在Internet RFCs 1321中有详细的描述(http://www.ietf.org/rfc/rfc1321.txt),这是一份最权威的文档,由Ronald L. Rivest在1992年8月向IEFT提交。   Rivest在1989年开发出MD2 算法 。在这个 算法 中,首先对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到信息末尾。并且根据这个新产生的信息计算出散列值。后来,Rogier和Chauvaud发现如果忽略了检验和将产生MD2冲突。MD2 算法 的加密后结果是唯一的--既没有重复。   为了加强 算法 的安全性,Rivest在1990年又开发出MD4 算法 。MD4 算法 同样需要填补信息以确保信息的字节长度加上448后能被512整除(信息字节长度mod 512 = 448)。然后,一个以64位二进制表示的信息的最初长度被添加进来。信息被处理成512位Damg?rd/Merkle迭代结构的区块,而且每个区块要通过三个 不同 步骤的处理。Den Boer和Bosselaers以及其他人很快的发现了攻击MD4版本中第一步和第三步的漏洞。Dobbertin向大家演示了如何利用一部普通的个人电脑在几分钟内找到MD4完整版本中的冲突(这个冲突实际上是一种漏洞,它将导致对 不同 的内容进行加密却可能得到相同的加密后结果)。毫无疑问,MD4就此被淘汰掉了。   尽管MD4 算法 在安全上有个这么大的漏洞,但它对在其后才被开发出来的好几种信息安全加密 算法 的出现却有着不可忽视的引导作用。除了MD5以外,其中比较有名的还有SHA-1、RIPE-MD以及HAVAL等。   一年以后,即1991年,Rivest开发出技术上更为趋近成熟的MD5 算法 。它在MD4的基础上增加了"安全-带子"(Safety-Belts)的概念。虽然MD5比MD4稍微慢一些,但却更为安全。这个 算法 很明显的由四个和MD4设计有少许 不同 的步骤组成。在MD5 算法 中,信息-摘要的大小和 填充 的必要条件与MD4完全相同。Den Boer和Bosselaers曾发现MD5 算法 中的假冲突(Pseudo-Collisions),但除此之外就没有其他被发现的加密后结果了。   Van Oorschot和Wiener曾经考虑过一个在散列中暴力搜寻冲突的函数(Brute-Force Hash Function),而且他们猜测一个被设计专门用来搜索MD5冲突的机器(这台机器在1994年的制造成本大约是一百万美元)可以平均每24天就找到一个冲突。但单从1991年到2001年这10年间,竟没有出现替代MD5 算法 的MD6或被叫做其他什么名字的新 算法 这一点,我们就可以看出这个瑕疵并没有太多的影响MD5的安全性。上面所有这些都不足以成为MD5的在实际应用中的问题。并且,由于MD5 算法 的使用不需要支付任何版权费用的,所以在一般的情况下(非绝密应用领域。但即便是应用在绝密领域内,MD5也不失为一种非常优秀的中间技术),MD5怎么都应该算得上是非常安全的了。 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除,从账户中取出amt,如果amt>账户余额抛出异常,一个实体Bean可以表示 不同 的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始化一个EJB实例 5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口函数得到远程接口的引用,用远程接口的引用访问EJB。 EJB中JNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的 不同 需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天通信演示代码 2个目标文件,一个服务器,一个客户端。 Java Telnet客户端实例源码 一个目标文件,演示Socket的使用。 Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码, 算法 相关,非对称加密   Java非对称加密源程序代码实例,本例中使用 RSA 加密技术,定义加密 算法 可用 DES,DESede,Blowfish等。   设定字符串为“张三,你好,我是李四”   产生张三的密钥对(keyPairZhang)   张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节   通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示。 java凭图游戏 一个目标文件,简单。 java求一个整数的因子 Java生成密钥的实例 1个目标文件 摘要:Java源码, 算法 相关,密钥   Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从文件中得到公钥编码的字节数组、如何从字节数组解码公钥。 Java数据压缩与传输实例 1个目标文件 摘要:Java源码,文件操作,数据压缩,文件传输   Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印   util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码加以改进做成小工具。 Java右键弹出菜单源码 Java圆形按钮实例代码,含注释 两个目标文件,自绘button。 Java圆形电子时钟源代码 1个目标文件 内容索引:JAVA源码,系统相关,电子钟   用JAVA编写的指针式圆形电子钟,效果图如下所示,其实代码很简单,希望对你有帮助。 Message-Driven Bean EJB实例源代码 2个目标文件 摘要:Java源码,初学实例,EJB实例   Message-Driven Bean EJB实例源代码,演示一个接收购物订单的消息驱动Bean,处理这个订单同时通过e-mail的形式   //给客户发一个感谢消息,消息驱动Bean必须实现两个接口MessageDrivenBean和MessageListener   在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息的内容。同时一个mail note将被发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-mail账号,查询mail 服务器的会话……   还包括消息客户端程序,通过连接创建会话。创建发送者和映射消息。发送消息,同时对文本进行少量修改,发送end-of-messages消息,最后关闭连接。 Tcp服务端与客户端的JAVA实例源代码 2个目标文件 摘要:Java源码,文件操作,TCP,服务器   Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第三步:在登陆后的界面文本框输入文本,然后发送 可以同时启动多个客户端 实现群聊。 浮动的广告 嵌套在html中 各种EJB之间的调用示例 7个目标文件 摘要:Java源码,初学实例,EJB调用实例   各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的UDP服务器模型源代码 2个目标文件 摘要:Java源码,网络相关,UDP   基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用 随机 函数抽取幸运数字 EJB的真实世界模型(源代码) 15个目标文件 摘要:Java源码,初学实例,基于EJB的真实世界模型   基于EJB的真实世界模型,附源代码,部分功能需JSP配合完成。 J2ME优化压缩PNG文件 4个目标文件 内容索引:JAVA源码,综合应用,J2me游戏,PNG,图形处理   这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失。使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu   Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码,文件操作,压缩包查看   Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,系统相关,数字签名,数字证书   Java 数字签名、数字证书的相关实例。   关于数字签名:产生 RSA 密钥对(myKeyPair),得到 RSA 密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定 算法 产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥验证签名结果,使用公钥初始化签名对象,用于验证签名。   数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录   一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手朋友可以学习一下。 JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个目标文件 摘要:Java源码,网络相关,浏览器   Java编写的HTML浏览器源代码,一个很简单甚至不算是浏览器的HTML浏览器,使用方法:   可直接输入文件名或网络地址,但必需事先连入网络。 Java编写的山寨QQ,多人聊天+用户在线 21个目标文件 摘要:JAVA源码,媒体网络,山寨QQ,Java聊天程序   Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构,   当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。   QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新好友列表,响应用户双击的事件,并得到好友的编号,把聊天界面加入到管理类,设置密码保护等。 Java编写的网页版魔方游戏 内容索引:JAVA源码,游戏娱乐,魔方,网页游戏   Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容索引:JAVA源码,系统相关,系统信息检测   用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字   Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例, 填充 颜色数组数据,初始化颜色数组。 Java吃豆子游戏源代码 6个目标文件 内容索引:JAVA源码,游戏娱乐,JAVA游戏源码   JAVA编写的吃豆子游戏,类似疯狂坦克一样,至少界面有点像。大家可以看截图。 Java从网络取得文件 1个目标文件 简单 Java从压缩包中提取文件 1个目标文件 简单 Java存储与读取对象 1个目标文件 如题 Java调色板面板源代码 1个目标文件 摘要:Java源码,窗体界面,调色板   使用Java 语言 编写的一款用于反映颜色变化的面板,也就是大家熟悉的颜色调色板演示程序。原理是初始化颜色选择按钮,然后为颜色选择按钮增加事件处理事件,最后实例化颜色选择器。 Java二进制IO类与文件复制操作实例 16个目标文件 内容索引:Java源码,初学实例,二进制,文件复制   Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,文件操作,权限控制   Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰效果   Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标,Y坐标、得到X坐标,Y坐标值、绘制火焰效果Image…… Java加密解密工具集 JCT v1.0源码包 5个目标文件 内容索引:JAVA源码,综合应用,JCT,加密解密   WDSsoft的一款免费源代码 JCT 1.0,它是一个Java加密解密常用工具包。 Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书   Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和客户端 2个目标文件,如题。 Java目录监视器源程序 9个目标文件 内容索引:JAVA源码,综合应用,目录监视   用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,日期选择   Java 语言 开发的简洁实用的日期选择控件,源码文件功能说明:   [DateChooser.java] Java 日期选择控件(主体类) [public]   [TablePanel.java] 日历表格面板   [ConfigLine.java] 控制条类   [RoundBox.java] 限定选择控件   [MonthMaker.java] 月份表 算法 类   [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP   Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个目标文件 摘要:Java源码,网络相关,FTP   Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。   部分源代码摘录:   ftpClient = new FtpClient(); //实例化FtpClient对象   String serverAddr=jtfServer.getText(); //得到服务器地址   String user=jtfUser.getText(); //得到用户名   String pass=jtfPass.getPassword().toString(); //得到密码   ftpClient.openServer(serverAddr); //连接到服务器   ftpClient.login(user,pass); //在服务器上注册   InputStream is=ftpClient.list(); //得到服务器目录与文件列表输入流   StringBuffer info=new StringBuffer(); //实例化StringBuffer对象,用于输出信息   int ch;   while ((ch=is.read())>=0){ //未读完列表,则继续   info.append((char)ch); //增加信息 Java实现的点对点短消息发送协议(smpp)开发包源码 70个目标文件,如题。 Java实现的放大镜效果附有源文件 1个目标文件 内容索引:Java源码,初学实例,放大镜,哈哈镜   Java实现的放大镜效果附有源文件,编译 环境 最近出了问题,因此没有测试,也没有抓到图,希望各位自行测试一下。 Java实现跟踪鼠标运行坐标的源码 1个目标文件 内容索引:JAVA源码,系统相关,鼠标钩子   Java编写的一个小程序,用以实现跟踪鼠标的运行位置(坐标),程序很小,很实用,暂时抓不到截图。 Java实现移动的遮照效果 1个目标文件 摘要:Java源码,初学实例,遮照效果   Java实现移动的遮照效果,先实现椭圆形的遮罩,实例化媒体加载器,最后在创建缓冲区中的图像形成遮罩效果,而且它是会移动的。 Java鼠标拖拽功能 1个目标文件 Netbeans平台下实现的JAVA 拖放效果的一个实例,包括源代码和所需的图片资源。 (运行后会全屏显示窗体,没有关闭按钮,可使用快捷键Ctrl + F4关闭~) Java图片倒影效果实例源码 1个目标文件 摘要:Java源码,图形操作,图片倒影   Java图片倒影效果实例源码,有意思也很有参考价值的一个Java图像处理小程序,先读取图像然后进行图像重绘,产生倒影的效果,仅供参考。 java网络五子棋的源代码 7个目标文件 AVA网络五子棋,实现基本功能,无多余花哨内容,适合大学生课程设计学习使用,内含完整可运行源代码及运行指导视频,Eclipse 环境 。 Java文件选择器源代码 2个目标文件 摘要:Java源码,文件操作,文件选择器   Java文件选择器源代码 Java文字跑马灯与信息窗口 1个目标文件 摘要:Java源码,文件操作,跑马灯   Java文字跑马灯效果与信息窗口,将一段文字按照滚动的方式显示出来,在网页设计中比较常见,本例使用Java实现文字跑马灯效果。 Java写的ATM机取款模拟程序 9个目标文件 内容索引:JAVA源码,综合应用,ATM,JAVA,模拟   基于Java技术,只实现了ATM机的取款过程,有兴趣和有能力的高手可以再加以改进,这样就更完美了。可作为Java初学者《面向对象》编程的一个很好范例。     在这个程序中,用到以下JAVA类库:      dataAccess(数据操作)类:包含用于数据库的相关操作   atmScreen(ATM屏幕)类:主要创建各操作窗体和相应按钮事件   Account(用户帐户)类:包含用户信息的验证、余额查询和扣钱等方法   readCard(读卡机)类:包含读取用户卡号和退卡(退出系统)   moneyMac(取钱机)类:只用于打印清单   Atm(系统)类:系统主方法的开始,负责调用其他类 Java写的巨型LCD液晶时钟显示屏 8个目标文件 内容索引:JAVA源码,综合应用,电子钟,LCD,液晶   一个巨型LCD数字电子时钟,用JAVA写的,运行截图如上示。它还带有右键菜单,LCD颜色可以变换等。 Java用GZIP压缩解压文件 1个目标文件 摘要:Java源码,文件操作,GZIP   Java使用GZIP压缩解压文件,如果你正在使用Java开发文件压缩或解压的功能,那么Gzip应该来说是比较值得参考的,那么本实例或许正是您需要的,Java基于Gzip的文件压缩与解压程序源代码,供源码下载者参考。 Java用Zip压缩多个文件实例源码 1个目标文件 摘要:Java源码,文件操作,压缩文件   Java用Zip压缩多个文件,一个Java文件操作小实例,用ZIP同进压缩多个文件,实际是打开文件读取,然后再利用ZipEntry实例化待压缩的条目列表,将ZIP条目列表写入输出流,从源文件得到文件输入流,写入缓冲数据等。 Java游戏使命的召唤源码 5个目标文件 内容索引:JAVA源码,游戏娱乐,Java游戏源码,使命的召唤   Java游戏使命的召唤源码,又名:Call of Duty,MFORMA超精典游戏,有兴趣的可以重新编译学习一下。 Java源码的仿QQ聊天程序 Java中的Blowfish对称密钥加密 算法 类和实例 2个目标文件 内容索引:Java源码, 算法 相关,Blowfish,JAVA加密,对称密钥 算法 JAVA中的Blowfish加密属于对称密钥 算法 ,如果知道密钥,则可以对加密后的数据解密,但如果如果不知道密钥,基本上是不可能的,因此,这就决定了它的先天不足,就是带来的密钥的管理问题。 Java中的SSL及HTTPS协议实例源码 1个目标文件 摘要:Java源码,网络相关,HTTPS协议   Java中的SSL及HTTPS协议实例源码,使用SSL套接字的HTTPS服务器端,接受客户端的一个连接,并返回Hello,world.   本例中使用8080端口创建SSL服务器套接字,返回缺省的SocketFactory对象,生成PrintWriter对象,用于输出信息。 Java自定义光标程序源码 1个目标文件 摘要:Java源码,窗体界面,自定义光标   Java自定义光标程序源码,将光标定义成其它形式的图标,利用ToolKit对象得到图像,实例化自定义光标对象,增加组件等。 Jav动画图标源码(显示GIF图像) 1个目标文件 摘要:Java源码,图形操作,动画图标   Jav动画图标源码(显示GIF图像),学习如何连续加载GIF图像从而生成动画图标,先创建一个用于显示动画图标的数组,创建构造函数,初始化数组,重载组件绘制方法,实例化Timer对象显示动画,增加组件到窗口上。 JSP树型菜单 DTree html+js实现 Notebook源码,Java记事本 2个目标文件 摘要:Java源码,文字字符,Java记事本   Java记事本:Notebook源码下载,虽然是个功能不多的记事本,但通过这个Java程序你可以学习到不少小技巧呢!比如创建界面、安装各种监听器,在窗体上布局主菜单,保存用户编辑的文件,以及如何使用"另存为"对话框保存文件,如何新建和打开一个文档等,源代码内包括了相当多的注释,是Java新手学习JAVA编程的好范例。   当用户按下窗口的“关闭”时,会自动调用此方法。 PDF分割与合并源代码 3个目标文件 能把一个PDF分割成多个单页的PDF,把多个PDF合并成一个PDF。 QR解码的Java实现程序 25个目标文件 内容索引:JAVA源码,媒体网络,QR解码,Java   用Java实现QR解码的源程序代码。 编译原理--LR(1)分析表构造(JAVA) 8个目标文件 如题 传奇私服登录器Java版附源代码 2个目标文件,如题。 单机版java五子棋V1.1 5个目标文件 完整的单机版java五子棋游戏,主要是判定胜负的 算法 ,使用数组进行遍历,很容易理解。 很强的Java加密解密 算法 源码 3个目标文件 内容索引:Java源码, 算法 相关,JAVA 算法 ,加密解密   很强的JAVA加密、解密 算法 源码,一共有6种 算法 可供选择,另外还可以直接生成ZIP压缩文件。 简单的注册与登录功能 6个目标文件 一个简单的用户登录界面 要连接数据库的 有登陆 注册功能 仅供初学者学习 简单模拟的J2ME潜艇大战源代码 4个目标文件 内容索引:JAVA源码,游戏娱乐,J2ME手机游戏,潜艇大战   简单模拟的J2ME手机游戏潜艇大战的源代码,界面有些粗糙,不过基本功能都实现了,发弹,躲闪等,可以帮助新手提高J2ME技术。 局域网广播系统java源码 java游戏 可实现网上对战和人机对战 7个目标文件 雷电游戏JAVA版源程序 8个目标文件 这是一个简单的Java仿雷电游戏(源码见包内),共设置有三关三个小BOSS。采用有GreenJVM发布,因此可以运行在未装载JRE的Windows系统之上。 网络蚂蚁Java版 14个目标文件 用Java实现的网络蚂蚁,功能强大,方便上传下载,断点续传等操作 网页浏览器 java学生成绩系统(图形界面) 14个目标文件 java学生课程管理系统 6个目标文件 一个较初级的EJB商业应用的例子 一个支持servlet的web服务器 14个目标文件 用Java加密类实现DES、 RSA 及SHA的加密 算法 9个目标文件 用java写的SFTP代码 用java实现的Tftp(Sftp)客户端与服务器程序。在这个程序中用到了一个“状态”的机制:客户端与服务器端在开始运行时有相同的状态,通过用户的输入或程序内部运行的机制,程序可以转到 不同 的状态,在 不同 的状态下程序实现了 不同 的功能。 用jdom解析xml 1个目标文件 要使用jdom解析xml文件,需要下载jdom的包,我使用的是jdom-1.1。解压之后,将lib文件夹下的.jar文件以及build文件夹下的jdom.jar拷贝到工程文件夹下,然后就可以使用jdom操作xml文件了。 copass源代码 Compass是一个强大的,事务的,高性能的对象/搜索引擎映射(OSEM:object/search engine mapping)与一个Java持久层框架. Compass实现了通过注册Hibernate的相关事件实现了数据的实时索引.. DataBuffer在Java中使用ADO.NET 本源码的作者对ADO.Net有着相当深厚的感情,有着对JAVA中DataBuffer类库运用的出色理解。它是开源项目javadesktop中的一个子项目,通过它你可以真正的理解DataSet、DataTable、DataRow……类库的使用。对这方面不太熟的开发者绝对有帮助。 HAHA CHAT Java仿QQ聊天程序源代码 iCHAT聊天室基于Java 内容索引:JAVA源码,媒体网络,iChat,Java聊天室   iChat LE 1.1版源码,一个比较大型的JAVA版聊天室程序,可能要用到DLL文件,压缩包内已经有了,一年前的程序。 IP定位器 J2ME黑白棋游戏手机版 v2.1完整源码 J2ME冒险游戏CASPER源代码 J2me月光战机游戏源码 JasperReports 报表类库v3.5 Java24点游戏逼真图形版代码 Java 3D魔方游戏源码及中文注释包 内容索引:JAVA源码,游戏娱乐,JAVA3D,魔方游戏   很强的JAVA 3D魔方游戏,这是源码及中文注释包,作者的开发文档和思路都在里面,对学习很有帮助! allin.dev 重载了ListView,更好的实现! copass源代码 Java (Jsp)制作简单的表单程序 java Socket通信实现 Java 版的酒店系统,貌似完整 Java 电梯模拟程序 v2.0 Java 飞机订票 Java 高考信息管理系统 SQL数据库 java 一个消息发布网站 Java+MsSQL超市进销存(毕业设计及答辩资料) Java+sqlserver2000做的员工管理系统 Java+SQL信用卡管理系统源代码 Java+XML日程提醒系统 Java+XML写的RSS阅读器 JAVA版Swing星际争霸游戏源代码 Java半透明图片实现的步骤及源代码 JAVA帮助视图组件库 Help GUI 1.1源代码 Java毕业论文:搜索引擎系统附源代码 JAVA毕业设计_员工管理系统含文档 Java毕业设计一款J2me飞行射击游戏 Java仓库管理系统,Access数据库 Java超市管理,SQL2000+源代码 Java超市进销存系统 Java大型CERP进销存系统 Java电子相册源码 Java赌神游戏网络版源代码 JAVA短信网关平台(值得一看) Java多用户聊天室程序(毕业设计) Java仿Vista界面风格的登录窗口 Java仿千千静听音乐播放器源代码 Java火影忍者游戏源代码 Java机车狂飙源代码 JAVA开发的打字软件源程序 Java开发的简单WEB服务器源码 Java聊天程序(JBuilder) Java聊天软件Visual Chat v1.91源码 Java模仿的MSN聊天软件 Java企业人事管理系统源码 JAVA轻量级的MVC框架应用实例 Java软件度量源码 Java声音播放程序源代码 JAVA实现CLDC与MIDP底层编程的代码 JAVA实现超级玛丽 Java实现的视频播放程序源码 Java手机短信项目源码 Java手机游戏大富翁源代码+注释 Java手机与计算机互发彩信源码 Java坦克大战网络对战版源代码 Java跳棋(基于SWT) Java通讯录手机版源码 Java图片翻折,将图像压扁 Java图书馆管理系统源程序 JAVA图书馆管理系统源码 Java图像文件的缩小与放大 Java推箱子游戏(50关+音效) JAVA网络抓包程序 Java文件切割器源代码 java项目源码在线相册系统 Java写的天气预报软件 Java写的图片幻灯片切换特效 Java写的一个mp3播放器 Java学生信息管理系统源码包 Java用的在线地图浏览模块 Java游戏沙丘城堡源代码 Java游戏中斜视角编辑器及引擎源代码 Java约瑟夫环演示Applet源码 Java中的EJB编程实例代码 Java转换xml JLoading Java版的Mp3下载工具 JSP 动态数据菜单 JSP 学生管理系统(全部代码+数据库) jsp+servlet+javabean+mysql党员信息管理系统 jsp高校科研项目管理系统 JSP开发的项目跟踪系统 jsp生产管理系统 msn聊天程序Java仿真代码 P2P--多用户在线聊天室(Java源码) P2P源码 Azureus 2.5.0.2(JAVA) Skype 4.0 Java版源码及开发文档 SnakeScript Java游戏脚本引擎 v1.1 Tsinghua IP 清华大学学生写的一个有关IP的Java程序 Visualvm 基于JAVA的CPU硬件资源管理器源程序 weblogic+j2ee构建音乐网站(原代码+数据库) web综合教学管理系统 YOYOPlayer 基于Java的网络播放器源代码 宾馆管理系统 超市购物系统 打地鼠游戏 单位固定资产登记管理系统JAVA版 电子书店管理系统 分离SQL Server数据库 基于BS结构的Java可视化工作流定制软件 基于J2ME的Java游戏梦幻炸弹人源程序 基于JAVA的ICQ系统 基于Java的mp3播放器源代码 基于JAVA的日程提醒簿 基于Java的小型人事管理系统,带数据库 基于Java的邮件服务器源程序 基于MVC的Java资源管理器 v2.0 季风进销存管理系统(JSP版) 家庭多媒体播放器 开源Winzip压缩工具Java版源码 客户管理系统 Alfresco Content Management 乐趣大型购物系统 类似QQ的聊天软件JAVA版源码(附设计文档) 连接postsql数据库的java代码 泡泡堂战车游戏JAVA版源码 配置ODBC数据源 企业进销存管理系统 轻松商城系统 手机游戏J2ME毕业设计 书籍管理系统 网络电视源代码TV-Browser 蜀山剑侠传游戏J2ME手机版源代码 物业管理系统毕业设计+源码 销售预测系统PDP系统 选修课程管理系统V1.2.3 阳光酒店管理系统 一款Java网络格斗游戏源码 用iText类库制作PDF文档 用JAVA做的聊天软件,有安装程序和源代码 在Servlet中连接数据库的Java代码 中国移动业务管理系统源码(SSH框架) 5、运行mian方法,成功之后会生成output.zip在当前项目目录下。ExportEncryptedPrivateKeyTool,查找。6、把output.zip上传到google play。2、源码导入IDEA后,搜索文件。 原本是不想写的,因为这个APP的这个版本其实很简单,后来想了下觉得还行记录一下吧。主要是记录每一次逆向能加深其中学到的知识点内容。也算是给自己一个交代,无论以后还是菜鸡也好还是成了大牛也罢,至少这一刻我没有虚度。... How to encode using RSA /NONE/OAEPWithSHA-1AndMGF1Padding? · Issue #464 · digitalbazaar/forge · GitHub 参考了上面的链接 js加密代码 var forge = require('node-forge'); var base64 = require('Base64'); var pki = forge.pki; publicKey = pki.publicKeyFromPem("-----BEGIN 展开全部1) RSA _PKCS1_PADDING 填充 模式,最常用的模式要求:输入 必须32313133353236313431303231363533e4b893e5b19e31333262353433 比 RSA 钥模长(modulus) 短至少11个字节, 也就是 RSA _size( rsa ) – 11如果输入的明文过长,必须切割, 然后 填充 输出 和modulus一样长根据这个要求,对于512b... 个人理解,n是两边都有的,具体加密中的p,q不知道,一个很大的数,想确定一对p*q=n很难(就算是质数也很难,因为数量真的很多) 用e加密,e是 随机 取的,用d解密 d是根据e和φ(n)算出来的 ,φ(n)是通过p和q算出来的 所以想破解d是很难的,关于怎么加密解密的过程, 注意点:M=C^d mod n 与C= M^e mod n的代换、ed的产生、1的n次幂还是1、以及欧拉定理 a^φ(n)=1 (mod n) 的同乘M。这样,一个具体用户就可以将自己设计的加密密钥和 算法 公诸于众,而只保密解密密钥。