Heim > Java > JavaBase > Hauptteil

Einführung in verstümmelte RSA-Zeichen in Java

Freigeben: 2019-12-03 10:43:25
Original
3011 Leute haben es durchsucht

Einführung in verstümmelte RSA-Zeichen in Java

Beim Verschlüsseln von Nachrichten mit relativ hohen Sicherheitsanforderungen gibt es viele Algorithmen. Ich verwende hier hauptsächlich den AES-Verschlüsselungsalgorithmus. Da es im Inland verwendet wird, ist es unvermeidlich, Chinesisch zu verschlüsseln und zu entschlüsseln. Bei diesem Vorgang wurde festgestellt, dass chinesische Zeichen leicht verstümmelt erscheinen, wenn keine Verarbeitung erfolgt. (Empfohlen: Java-Video-Tutorial)

Die folgenden Situationen sind häufig:

1. Verstümmelte chinesische Zeichen

Verschlüsseln Sie das Passwort nicht

byte[] decryptResult = decrypt(encryptResult, password);
     System.out.println("解密后:" + new String(decryptResult));
Nach dem Login kopieren

Nach dem Ausführen

加密前:我是shoneworn
解密后:鎴戞槸shoneworn
Nach dem Login kopieren

2. Codieren Sie den Text, aber während des Übertragungsprozesses wird Byte[] hastig in String konvertiert, String code = new String(bytes); Da der AES-Verschlüsselungsalgorithmus eine Verschlüsselung erfordert Text ist ein Vielfaches von 16 Bit. Wenn Sie also so vorgehen, werden bei der Entschlüsselung verschiedene Fehler gemeldet. Wie zum Beispiel das Folgende.

String code = new String(encryptResult);        
byte[] decryptResult = decrypt(code.getBytes(), password);
Nach dem Login kopieren

Während der AES-Verschlüsselung werden die verschlüsselten Daten in ein Byte-Array im Codierungsformat umgewandelt, bei dem es sich um die Methode String.getBytes() handelt. Wenn die Methode getBytes keine Parameter festlegt, ist das Standard-Codierungsformat der Maschine wird standardmäßig verwendet. Änderung an String.getBytes("utf-8") Problem gelöst.

Beispiel für die Verwendung der RSA-Verschlüsselung und -Entschlüsselung:

package com.ailin.test;import java.io.UnsupportedEncodingException;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.KeyGenerator;import javax.crypto.NoSuchPaddingException;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;public class AES {    /**
     * 加密
     * 
     * @param content
     *            需要加密的内容
     * @param password
     *            加密密码
     * @return
     */
    public static byte[] encrypt(String content, String password) {        try {
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            kgen.init(128, new SecureRandom(password.getBytes()));
            SecretKey secretKey = kgen.generateKey();            byte[] enCodeFormat = secretKey.getEncoded();
            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
            Cipher cipher = Cipher.getInstance("AES");// 创建密码器
            byte[] byteContent = content.getBytes("utf-8");
            cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
            byte[] result = cipher.doFinal(byteContent);            return result; // 加密
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }        return null;
    }    /**
     * 解密
     * 
     * @param content
     *            待解密内容
     * @param password
     *            解密密钥
     * @return
     */
    public static byte[] decrypt(byte[] content, String password) {        try {
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            kgen.init(128, new SecureRandom(password.getBytes()));
            SecretKey secretKey = kgen.generateKey();            byte[] enCodeFormat = secretKey.getEncoded();
            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
            Cipher cipher = Cipher.getInstance("AES");// 创建密码器
            cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
            byte[] result = cipher.doFinal(content);            return result; // 加密
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }        return null;
    }    /**
     * 将二进制转换成16进制
     * 
     * @param buf
     * @return
     */
    public static String parseByte2HexStr(byte buf[]) {
        StringBuffer sb = new StringBuffer();        for (int i = 0; i < buf.length; i++) {
            String hex = Integer.toHexString(buf[i] & 0xFF);            if (hex.length() == 1) {
                hex = &#39;0&#39; + hex;
            }
            sb.append(hex.toUpperCase());
        }        return sb.toString();
    }    /**
     * 将16进制转换为二进制
     * 
     * @param hexStr
     * @return
     */
    public static byte[] parseHexStr2Byte(String hexStr) {        if (hexStr.length() < 1)            return null;        byte[] result = new byte[hexStr.length() / 2];        for (int i = 0; i < hexStr.length() / 2; i++) {            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
            result[i] = (byte) (high * 16 + low);
        }        return result;
    }    /**
     * 加密
     *
     * @param content
     *            需要加密的内容
     * @param password
     *            加密密码
     * @return
     */
    public static byte[] encrypt2(String content, String password) {        try {
            SecretKeySpec key = new SecretKeySpec(password.getBytes(), "AES");
            Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");            byte[] byteContent = content.getBytes("utf-8");
            cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
            byte[] result = cipher.doFinal(byteContent);            return result; // 加密
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }        return null;
    }    public static void main(String[] args) throws UnsupportedEncodingException {
        String content = "我是shoneworn";
        String password = "12345678";        // 加密
        System.out.println("加密前:" + content);        byte[] encode = encrypt(content, password);        
        //传输过程,不转成16进制的字符串,就等着程序崩溃掉吧
        String code = parseByte2HexStr(encode);
        System.out.println("密文字符串:" + code);        byte[] decode = parseHexStr2Byte(code);        // 解密
        byte[] decryptResult = decrypt(decode, password);
        System.out.println("解密后:" + new String(decryptResult, "UTF-8")); //不转码会乱码            
         }
}
Nach dem Login kopieren

Für weitere Java-Kenntnisse beachten Sie bitte die Spalte Java Basic Tutorial.

Das obige ist der detaillierte Inhalt vonEinführung in verstümmelte RSA-Zeichen in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!