2011-07-29 31 views
2

當前正在尋找一種用於生成安全AES密鑰的面向用戶輸入的方法。該應用程序將成爲一個控制檯應用程序,它通過複製隨機生成的文本字符串來獲取用戶輸入,其中考慮按鍵間隔時間以生成隨機AES密鑰。我有什麼辦法可以做到這一點?控制檯應用程序中的Java KeyListener

+0

你真的需要這種熵源嗎?你不能只問用戶必要的種子,或者只是從系統的隨機數發生器中獲取它們? – hugomg

回答

1

似乎沒有便攜的方式。您需要讀取單個字符,該字符默認情況下未啓用,即使使用Console類也是如此。通常,Java只讀入整行。 Here's the question of how to get around that.摘要:將控制檯敲入原始模式。

假設你是在UNIX系統上,這個工作(在OSX測試):

import java.io.Console; 
import java.io.IOException; 
import java.io.Reader; 
import java.util.ArrayList; 


public class Main { 

    public static void main(String[] args) throws IOException, InterruptedException { 
     String[] cmd = {"/bin/sh", "-c", "stty raw </dev/tty"}; 
     Runtime.getRuntime().exec(cmd).waitFor(); 
     Console console = System.console(); 
     Reader reader = console.reader(); 
     ArrayList<Long> timeStamps = new ArrayList<Long>(); 
     StringBuilder password = new StringBuilder(); 
     timeStamps.add(System.currentTimeMillis()); 
     System.out.println("Enter your 8 character password"); 
     for(int i = 0;i<8;i++) { 
      password.append(reader.read()); 
      timeStamps.add(System.currentTimeMillis()); 
     } 
     System.out.println("Timestamps: "); 
     System.out.println(timeStamps); 
     cmd = new String[] {"/bin/sh", "-c", "stty sane </dev/tty"}; 
     Runtime.getRuntime().exec(cmd).waitFor();   
    } 
} 
1

不是一個真正的回答你的問題,但沒有任何理由KeyGenerator將不適合你的目的是什麼?

KeyGenerator keyGen = KeyGenerator.getInstance("AES"); 
keyGen.init(256, SecureRandom.getInstance("SHA1PRNG")); 
+0

就是這樣,賦值是一個加密賦值,生成AES密鑰的代碼必須是我自己的。 – tinylanda

+0

@tinylanda:只有生成密鑰的代碼或者生成隨機數據的代碼? (例如,即使不是KeyGenerator,您也可以使用SecureRandom)? –

+0

我正要實現blum blum shub並開始剃鬚,但是我正在尋找一個沒有算法的隨機生成密鑰,AES後面的所有東西都需要我自己..這就是說我正在尋找從不同變量生成明文,然後使用SHA256的MessageDigest()生成256個AES .. – tinylanda

0

也許是很愚蠢的答案,但可以用輸入鍵替換「任意鍵」嗎?在這種情況下,您可以使用讀線的準確時間和抖動來代替單獨的字符。您可以使用System.nanoTime()來 - 可能 - 添加一些熵。請注意,雖然通常這樣的方案會給你一些熵,但它足夠JVM,操作系統和機器相關,不能在現場使用它。

0

JLine可能會有所幫助。該庫有一些本機代碼,但可以在不同的平臺上工作,並且可以從控制檯讀取單個字符。

相關問題