应用领域:IC卡,POS机,ATM机,加油站,高速公路收费站。
应用场景:信用卡持卡人的PIN的加密传输,IC卡与 POS机之间的双向认证。
算法入口参数:KEY,Data,Mode
key:DES算法的工作密钥
Mode:DES算法的工作模式(加密|解密)
Data:需要加密或解密的数据
工作方式:
如果Mode为加密模式,则用key对数据data进行加密处理,生成data的密码模式
如果Mode为解密模式,则用key对数据data进行解密处理,还原data的明码模式
这样,在通信网络的两端,双方约定好一致的key,源端用key对核心数据进行DES加密,以密码形式传输到目的端,数据到达目的端后,用同样的key对密码数据进行解密,便再现了明码形式的核心数据,从而确保了通信数据在网络传输过程中的安全性和可靠性。
而通过定期在源端和目的端同时更新相同的key,便更进一步提高数据的保密性。
应用实例:加密解密文件操作
步骤1:调用java API生成DES算法的key值,将该key保存到文件中去,供网络通信的源端和目的端使用。
步骤2:源端对测试文件进行加密处理,加密后将文件以密码的形式发送到目的端。
步骤3:目的端对已加密的文件进行解密,还原文件的明码模式。
方法:
savePriveKey(String keyFile):将密钥保存到指定文件中
encryptionFile(String file,String keyFile)//加密文件,通过指定的key文件
decryptionFile(String file,String keyFile)//解密文件,通过指定的key文件
java源码:
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; /** * DES加密解密操作 * @author chenxu */ public class DESUtil { /** * 将私钥保存到指定文件中 * @param keyFile 保存私钥的文件 */ public void savePriveKey(String keyFile){ FileOutputStream fos=null; try { KeyGenerator keyGen=KeyGenerator.getInstance("DES"); SecureRandom sr=new SecureRandom(); keyGen.init(sr); SecretKey key=keyGen.generateKey(); byte[] rawKeyData=key.getEncoded(); fos=new FileOutputStream(keyFile); fos.write(rawKeyData); } catch (IOException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); }finally{ if(fos!=null){ try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * 加密字符串 * @param text 要加密的字符串 * @param keyFile 密钥文件 */ public void encryptionFile(String file,String keyFile){ SecureRandom sr=new SecureRandom(); SecretKey key=getPrivetKey(keyFile); FileInputStream fis=null; FileOutputStream fos=null; try { Cipher cipher=Cipher.getInstance("DES"); cipher.init(Cipher.ENCRYPT_MODE, key,sr); fis=new FileInputStream(new File(file)); byte[] data=new byte[fis.available()]; fis.read(data); byte[] encryptedData=cipher.doFinal(data); fos=new FileOutputStream(new File(file)); fos.write(encryptedData); } catch (Exception e) { e.printStackTrace(); }finally{ try { if(fis!=null){ fis.close(); } if(fos!=null){ fos.close(); } } catch (IOException e) { e.printStackTrace(); } } } /** * 对已加密的文件进行解密 * @param file 已加密的文件 * @param keyFile 密钥文件 */ public void decryptionFile(String file,String keyFile){ SecretKey key=getPrivetKey(keyFile); SecureRandom sr=new SecureRandom(); FileInputStream fis=null; FileOutputStream fos=null; try { Cipher cipher=Cipher.getInstance("DES"); cipher.init(Cipher.DECRYPT_MODE,key,sr); fis=new FileInputStream(new File(file)); byte[] encryptedData=new byte[fis.available()]; fis.read(encryptedData); byte[] decryptedData=cipher.doFinal(encryptedData); fos=new FileOutputStream(new File(file)); fos.write(decryptedData); } catch (Exception e) { e.printStackTrace(); }finally{ try { if(fis!=null){ fis.close(); } if(fos!=null){ fos.close(); } } catch (IOException e) { e.printStackTrace(); } } } /** * 获取私钥 * @param keyFile 私钥文件 * @return 个人私钥 */ private SecretKey getPrivetKey(String keyFile) { FileInputStream fis=null; SecretKey key=null; try { fis=new FileInputStream(new File(keyFile)); byte[] rawKeyData=new byte[fis.available()]; fis.read(rawKeyData); DESKeySpec dks=new DESKeySpec(rawKeyData); key=SecretKeyFactory.getInstance("DES").generateSecret(dks); }catch (Exception e) { e.printStackTrace(); }finally{ try { if(fis!=null){ fis.close(); } } catch (IOException e) { e.printStackTrace(); } } return key; } public static void main(String[] args){ DESUtil desUtil=new DESUtil(); // desUtil.savePriveKey("key.txt"); // desUtil.encryptionFile("test.txt", "key.txt"); desUtil.decryptionFile("test.txt", "key.txt"); } }