如何要求用户在java代码中输入加密文本

时间:2013-12-20 22:11:21

标签: java security encryption cryptography

我有这个java代码,它的加密只有一个给定的文本已经写在代码中 如何编辑此代码以使程序要求用户输入文本,然后对文本进行加密并显示最终结果?我试图替换文字("NagaSakti");和("bismillah");(System.in);但它没有用!!请帮帮我

import java.io.UnsupportedEncodingException;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.KeySpec;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;



public class DesEncrypter {
  Cipher ecipher;


    // 8-byte Salt
    byte[] salt = {
        (byte)0xA9, (byte)0x9B, (byte)0xC8, (byte)0x32,
        (byte)0x56, (byte)0x35, (byte)0xE3, (byte)0x03
    };

    // Iteration count
    int iterationCount = 19;
    public static final DesEncrypter NAGASAKTI = new DesEncrypter("NagaSakti");

    private DesEncrypter(String passPhrase) {
        try {
            // Create the key
            KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt, iterationCount);
            SecretKey key = SecretKeyFactory.getInstance(
                "PBEWithMD5AndDES").generateSecret(keySpec);
            ecipher = Cipher.getInstance(key.getAlgorithm());


            // Prepare the parameter to the ciphers
            AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);

            // Create the ciphers
            ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);

        } catch (java.security.InvalidAlgorithmParameterException e) {
        } catch (java.security.spec.InvalidKeySpecException e) {
        } catch (javax.crypto.NoSuchPaddingException e) {
        } catch (java.security.NoSuchAlgorithmException e) {
        } catch (java.security.InvalidKeyException e) {
        }
    }

    public String encrypt(String str) {
        try {
            // Encode the string into bytes using utf-8
            byte[] utf8 = str.getBytes("UTF8");

            // Encrypt
            byte[] enc = ecipher.doFinal(utf8);

            // Encode bytes to base64 to get a string
            return new sun.misc.BASE64Encoder().encode(enc);
        } catch (javax.crypto.BadPaddingException e) {
        } catch (IllegalBlockSizeException e) {
        } catch (UnsupportedEncodingException e) {
        }
        return null;
    }



    public static void main(String args[]){
       String encrypted = DesEncrypter.NAGASAKTI.encrypt("bismillah"); 
        System.out.println("Enter your text");  


      System.out.println("encrypted text=  "+ encrypted);

    }
}

3 个答案:

答案 0 :(得分:1)

使用Console来读取密码。您的main方法可能如下所示:

public static void main(String args[])
{
  Console console = System.console();
  if (console == null)
    throw new IllegalStateException("console required");
  char[] password = console.readPassword("Enter your text: ");
  DesEncrypter encrypter = new DesEncrypter(new String(password));
  String encrypted = encrypter.encrypt("bismillah");
  System.out.println("encrypted text =  " + encrypted);
}

使用Console类'专用API有一些优点。

首先,您不要将密码回显到屏幕上。这有助于保护它免受肩膀冲浪的匪徒。

此外,密码作为字符数组返回,以便应用程序可以在完成密码使用时使用零或随机字符填充数组。这样可以最大限度地减少因分页而被写入磁盘的可能性,或者包含在堆转储中等等。

最后,使用正确的高级API可以清楚地了解您的代码正在做什么,利用该功能的任何未来改进,并简化您的应用程序。

使用加密还存在许多其他问题,我不建议任何人按原样使用代码,但我专注于提出的问题。

答案 1 :(得分:0)

尝试这样的事情:

  //  open up standard input
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

  String textFromUser = null;

  //  read the text from the command-line; need to use try/catch with the
  //  readLine() method
  try {
     textFromUser = br.readLine();
  } catch (IOException ioe) {
     System.out.println("IO error trying to read your text!");
  }

答案 2 :(得分:-1)

您可以使用Scanner类。 添加此导入:

import java.util.Scanner;

然后在你的主要方法中这样做:

public static void main(String args[]){
    Scanner keyboard = new Scanner(System.in);
    System.out.println("Enter your text");  
    String textToEncrypt = keyboard.next();

    String encrypted = DesEncrypter.NAGASAKTI.encrypt(textToEncrypt);

    System.out.println("encrypted text=  "+ encrypted);
}

如果您想使用NagaSakti以外的密码短语,请将以字符串加密...开头的行更改为

System.out.println("Enter your pass phrase");  
String passPhrase = keyboard.next();
String encrypted = new DesEncrypter(passPhrase).encrypt(textToEncrypt);

请注意,您还必须将DesEncrypter构造函数更改为public才能执行此操作。