首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

加密相关的一些步骤

2013-12-11 
加密相关的一些方法(1)求两个字节数组的异或/*** * 求异或. ** @param strOldHex: hex string * @param st

加密相关的一些方法

(1)求两个字节数组的异或

/*** * 求异或. *  * @param strOldHex  : hex string * @param strKeyHex  : hex string * @return */public static byte[] xOR(String strOldHex, String strKeyHex) {byte[] oldBytes = ByteStringUtil.hexString2Bytes(strOldHex);byte[] keyBytes = ByteStringUtil.hexString2Bytes(strKeyHex);byte[] xorResult = new byte[oldBytes.length];int keyIndex = 0;for (int x = 0; x < oldBytes.length; x++) {xorResult[x] = (byte) (oldBytes[x] ^ keyBytes[keyIndex]);if (++keyIndex == keyBytes.length) {keyIndex = 0;}}return xorResult;}

?测试如下:

@Testpublic void test_XOR() {String strOldHex = "8080";String strKeyHex = "8182";byte[]xorResult=CustomMACUtil.xOR(strOldHex, strKeyHex);System.out.println("---------------");System.out.println(ByteStringUtil.byteArrayToHexString(xorResult));}

?运行结果:

0102

注意:上述方法的参数是十六进制位串

(2)CBC加密

/** * 加密函数 *  * @param data *            加密数据 * @param key *            密钥 * @param iv  * @return 返回加密后的数据 */public static byte[] desCBCEncrypt(byte[] data, byte[] key, byte[] iv) {try {// 从原始密钥数据创建DESKeySpec对象DESKeySpec dks = new DESKeySpec(key);// 创建一个密匙工厂,然后用它把DESKeySpec转换成// 一个SecretKey对象SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");SecretKey secretKey = keyFactory.generateSecret(dks);// Cipher对象实际完成加密操作// Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");// 若采用NoPadding模式,data长度必须是8的倍数Cipher cipher = Cipher.getInstance("DES/CBC/NoPadding");// 用密匙初始化Cipher对象IvParameterSpec param = new IvParameterSpec(iv);cipher.init(Cipher.ENCRYPT_MODE, secretKey, param);// 执行加密操作byte encryptedData[] = cipher.doFinal(data);return encryptedData;} catch (Exception e) {System.err.println("DES-CBC算法,加密数据出错!");e.printStackTrace();}return null;}

?测试如下:

@Testpublic void test_desCBCEncrypt() {String data2 = "03DA9F790A007A1Fe49309DA148F5c00";String leftHalf = "1b03aa6415bb0a54";byte[] macResultBytes;macResultBytes = DESUtil.desCBCEncrypt(ByteStringUtil.hexString2Bytes(data2),ByteStringUtil.hexString2Bytes(leftHalf), new byte[8]);System.out.println(ByteStringUtil.byteArrayToHexString(macResultBytes));}

?运行结果:

9a3fa1e6957f79dbad799659880af8e6

?注意:上述加密不是普通的DES加密

?

(3)DES3加密

// keybyte为加密密钥,长度为24字节// src为被加密的数据缓冲区(源)public static byte[] encryptMode(byte[] src, byte[] keybyte) {try {// 如果加密密钥的长度为16个字节,则把开始的8个字节补到最后变成24个字节if (keybyte.length == 16) {String newKeybyte = ByteStringUtil.byteArrayToHexString(keybyte);String newKeybyte1 = newKeybyte + newKeybyte.substring(0, 16);keybyte = ByteStringUtil.hexString2Bytes(newKeybyte1);}// 生成密钥SecretKey deskey = new SecretKeySpec(keybyte, "DESede");final IvParameterSpec iv = new IvParameterSpec(new byte[8]);// 加密Cipher c1 = Cipher.getInstance("DESede/CBC/PKCS5Padding");c1.init(Cipher.ENCRYPT_MODE, deskey,iv);return c1.doFinal(src);} catch (java.security.NoSuchAlgorithmException e1) {e1.printStackTrace();} catch (javax.crypto.NoSuchPaddingException e2) {e2.printStackTrace();} catch (java.lang.Exception e3) {e3.printStackTrace();}return null;}

?

热点排行