データの暗号化
4649 ワード
本文は主にデータ暗号化に関する技術を紹介し、データは暗号化の形式で伝送され、データの安全性を保証する.誰かが途中でデータを切り取ったとしても、解読できない.標準的な暗号化アルゴリズムは2種類あり、対称アルゴリズム:DES、3 DES、AES;非対称アルゴリズム:RSA,SSL,本稿では対称アルゴリズムのみを紹介する.
まず暗号化とは何か.簡単に言えば、暗号化は、あなたが知っている、私が知っている、彼が知らないことです.データの原文は、鍵を介して演算され、暗号文が得られ、相手はその鍵を介して復号することができる.暗号化アルゴリズムは公開され、秘密は秘密鍵に存在する.
以下では、8バイトごとにグループ化され、パケット暗号化されたDESアルゴリズムについて説明します.鍵は8バイトです.暗号化方式にはECB,CBC,FCBなどがある.私たちはECB方式しか話していません.鍵は8バイトであるため,まず鍵を処理し,8バイト以上であれば切り取り,すなわち補完する.そこでツールクラスを書きます:AdCrypto
このツールクラスでは鍵を処理することができ,その後,原文を処理する必要がある.8バイトごとに暗号化されているため、私たちのデータは8の整数倍でなければなりませんが、実際には満足しにくいので、それを補完します.我々が採用した方法は,PKCS 5アルゴリズム補完方式である.このアルゴリズムの実現は,我々が自分で書く必要はなく,jdkで直接持参すればよい.次に例を示します.
実は、この暗号化方式はもう時代遅れで、今よく使われているのはAESアルゴリズムで、その鍵は16バイトですが、DESと同じように、Cipher c=Cipherだけです.getInstance("AES/ECB/PKCS5Padding"); SecretKeySpec keySpec = new SecretKeySpec(key, "AES");少し修正すればいいです.
まず暗号化とは何か.簡単に言えば、暗号化は、あなたが知っている、私が知っている、彼が知らないことです.データの原文は、鍵を介して演算され、暗号文が得られ、相手はその鍵を介して復号することができる.暗号化アルゴリズムは公開され、秘密は秘密鍵に存在する.
以下では、8バイトごとにグループ化され、パケット暗号化されたDESアルゴリズムについて説明します.鍵は8バイトです.暗号化方式にはECB,CBC,FCBなどがある.私たちはECB方式しか話していません.鍵は8バイトであるため,まず鍵を処理し,8バイト以上であれば切り取り,すなわち補完する.そこでツールクラスを書きます:AdCrypto
package my;
/**
*
* @author andy
*
*/
public class AdCrypto
{
/**
*
* @param data
* @param N
* @return
*/
public static byte[] truncate(byte[] data , int N)
{
if(data.length <= N)
return data;
byte[] buf = new byte[N];
for(int i=0 ; i < N ; i++)
{
buf[i] = data[i];
}
return buf;
}
/**
*
* @param data
* @param N
* @param p
* @return
*/
public static byte[] padding(byte[] data , int N , byte p)
{
//
int r = data.length % N;
if(r == 0) return data;
byte[] result = new byte[N];
for(int i=0 ; i < N ; i++)
{
if(i > data.length-1)
result[i] = p;
else
result[i] = data[i];
}
return result;
}
}
このツールクラスでは鍵を処理することができ,その後,原文を処理する必要がある.8バイトごとに暗号化されているため、私たちのデータは8の整数倍でなければなりませんが、実際には満足しにくいので、それを補完します.我々が採用した方法は,PKCS 5アルゴリズム補完方式である.このアルゴリズムの実現は,我々が自分で書く必要はなく,jdkで直接持参すればよい.次に例を示します.
package my;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Hex;
/**
* DES
* @author andy
*
*/
public class DESDemo
{
/**
*
* @param plain
* @param key
* @return
* @throws NoSuchPaddingException
* @throws NoSuchAlgorithmException
* @throws InvalidKeySpecException
* @throws InvalidKeyException
* @throws BadPaddingException
* @throws IllegalBlockSizeException
*/
public static byte[] encrypt(byte[] plain , byte[] key) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidKeySpecException, IllegalBlockSizeException, BadPaddingException
{
//DES , PKCS5
Cipher c = Cipher.getInstance("DES/ECB/PKCS5Padding");
//
SecretKeyFactory keyFectory = SecretKeyFactory.getInstance("DES");
SecretKeySpec keySpec = new SecretKeySpec(key, "DES");
c.init(Cipher.ENCRYPT_MODE, keySpec);
//
byte[] output = c.doFinal(plain);
return output;
}
/**
*
* @param cipher
* @param key
* @return
* @throws NoSuchAlgorithmException
* @throws NoSuchPaddingException
* @throws InvalidKeyException
* @throws InvalidKeySpecException
* @throws BadPaddingException
* @throws IllegalBlockSizeException
*/
public static byte[] decrypt(byte[] cipher , byte[] key) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidKeySpecException, IllegalBlockSizeException, BadPaddingException
{
//DES
Cipher c = Cipher.getInstance("DES/ECB/PKCS5Padding");
//
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKeySpec keySpec = new SecretKeySpec(key, "DES");
c.init(Cipher.DECRYPT_MODE, keySpec);
//
byte[] output = c.doFinal(cipher);
return output;
}
public static void main(String[] args) throws InvalidKeyException, Exception, Exception, Exception
{
// , DES 8
byte[] key = "2019tes".getBytes();
key = AdCrypto.padding(key, 8, (byte)0);
//
byte[] plain = {
1, 2, 3, 4, 5, 6, 7, 8,
41, 42, 43, 44, 45, 46, 47, 48,
61, 62, 63, 64, 65, 66, 67, 68,
};
//
byte[] cipher = encrypt(plain, key);
String str = "d31b6374385cf76020ab8c65f0ad45e1adeed30e180b20c8b9581f41d3c4b5dc";
byte[] buf = Hex.decodeHex(str);
//
byte[] plain2 = decrypt(buf , key);
System.out.println(" : " + Hex.encodeHexString(plain));
System.out.println(" : " + Hex.encodeHexString(cipher));
System.out.println(" :" + Hex.encodeHexString(plain2));
}
}
実は、この暗号化方式はもう時代遅れで、今よく使われているのはAESアルゴリズムで、その鍵は16バイトですが、DESと同じように、Cipher c=Cipherだけです.getInstance("AES/ECB/PKCS5Padding"); SecretKeySpec keySpec = new SecretKeySpec(key, "AES");少し修正すればいいです.