des加密的java實現中DescKey des = new DescKey(); des.setKey("bjwpn"); 秘鑰不夠8個位元組會怎麼處理呢?tomorrow9512018-03-18 14:16:09

看到這個問題我腦海中的第一個反應是:Java中DES加密的實現什麼時候有DescKey這個物件了?然後我試著用Eclipse寫個Java程式,發現確實沒有DescKey這個物件…

經過進一步搜尋,我似乎找到了這個問題的來源,以及DescKey這個物件的來源了。我想,提問的朋友引用的是來自CSDN中cuiran撰寫的一段程式吧?網頁連結如下:試問用DES加密解密是否安全。因為這裡面出現了提問朋友涉及到的DescKey這個類,同時這個類其中的一個建構函式設定的密碼也為“bjwpn”。

所以呢,希望提問的朋友能夠把原始碼的來源告訴大家,方便大家幫助你呀~

=====================我是解決問題的分割線============================其實這個問題如果仔細閱讀原始碼的話是能夠解決的,setKey()這個函式本身也是作者撰寫的,其原始碼是這樣的:public void setKey(String strKey) { try{ KeyGenerator _generator = KeyGenerator。getInstance(“DES”); _generator。init(new SecureRandom(strKey。getBytes())); this。key = _generator。generateKey(); _generator = null; } catch (Exception e) { throw new RuntimeException(“Error initializing SqlMap class。 Cause: ” + e); }}實際上,能夠回答提問朋友問題的2行程式碼為:_generator。init(new SecureRandom(strKey。getBytes()));this。key = _generator。generateKey();這2行程式碼的意思是,將strKey轉換成Byte陣列,然後以這個陣列作為隨機數的種子,初始化KeyGenerator的例項_generator。然後,用_generator產生一個秘鑰,並傳遞給key變數。所以,實際上傳進來的諸如“2222”,或者“bjwpn”等字串,都先轉化為Byte陣列,然後作為隨機數生成器的種子,產生隨機數。由於真正的64bit秘鑰是_generator用種子產生的,_generator本身保證了產生金鑰的長度合法性。同時,由於加密解密使用了相同的字串作為_generator的種子,引起其產生的金鑰也是相同的,這就保證了演算法解密的正確性。

總的來說呢,還是希望提問的朋友能夠細緻地讀一讀原始碼啦。密碼學中金鑰長度的合法性一般都是作為密碼演算法的前提條件。而一般正確產生金鑰的方法都是用隨機數生成器+種子的形式,或者是用Hash+擷取合法長度的形式產生的。