PCDVD數位科技討論區

PCDVD數位科技討論區 (https://www.pcdvd.com.tw/index.php)
-   七嘴八舌異言堂 (https://www.pcdvd.com.tw/forumdisplay.php?f=12)
-   -   請問 AES加密的實作 (https://www.pcdvd.com.tw/showthread.php?t=1052119)

公不 2014-06-18 08:11 PM

請問 AES加密的實作
 
請問 AES加密

根據網路上的

在此段是開始加密
其中raw是要加密的內容
clear是private_key

引用:
private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/ZeroBytePadding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(clear);
return encrypted;
}

如果我要將raw先填充一些東西

如下JavaScript的

JavaScript的block就是上面的raw

引用:
for (var i=0; i<8; i++) {
var block = new Array(32);

for (var j=0; j<32; j++)
{
block[j] = input_byte[i*32+j];
}
block = AES_Encrypt(block,private_key_byte);

for (var j=0; j<32; j++)
{
output_byte[i*32+j] = block[j];
}
}


請問我該如何加入?

謝謝

micall.lee 2014-06-18 08:15 PM

我建議你要問應該去幾個專門討論程式設計的網站比較會有快一點的回應

藍色小舖、程式設計俱樂部應該比較多人

JAVA那邊好像也有不錯的論壇

微軟就不用說了 MSDN 那邊一堆

在這裡問我怕是會影響到你的專案進度

789w 2014-06-18 08:23 PM

這大3修資訊安全實做過的東西...
你的程度 :jolin:

crisliu2004 2014-06-18 08:33 PM

看你的code很多函數都是內建的

看不出來裡面是什麼

AES有很多加密法 不是只有一種

小弟我只用過CBC法

看C語言,直接看source code會比較清楚

看過openssl、cyassl裡面都有

silent 2014-06-18 08:57 PM

樓主之前面問過的也沒後續回應,到底有沒有解決問題也不說一下,

遇到問題就貼個ㄧ小段code,前言後語背景也不講一下,

都是這領域最令人討厭的行為,

去一些軟體或程式論壇看會不會有人理。

公不 2014-06-18 09:02 PM

抱歉


因為目前AES加密

是用javascript 來做AES

原始參考的是

http://point-at-infinity.org/jsaes/jsaes.js

裡面的範例去修改的

可是

手邊版本的

1.江AES_ExpandKey給關閉

2. 然後使用類似

代碼:
*    AES_Init();
 *
 *    var block = new Array(16);
 *    for(var i = 0; i < 16; i++)
 *        block[i] = 0x11 * i;
 *
 *    var key = new Array(32);
 *    for(var i = 0; i < 32; i++)
 *        key[i] = i;
 *
 *    AES_ExpandKey(key);
 *    AES_Encrypt(block, key);
 *
 *    AES_Done();


只是部分修改

但因為安全問題

想要改回直接使用JAVA

而JAVA部分

我是參考網路SimpleCrypto

http://www.androidsnippets.com/encryptdecrypt-strings

目前看到

代碼:
private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/ZeroBytePadding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(clear);
return encrypted;
}
這邊是我可能需要修改的地方

因此請問該如何改?

謝謝

crisliu2004 2014-06-18 09:51 PM

你可能要先搞懂

AES_Init();裡面做了什麼事

AES_ExpandKey(key);對傳進去的key做了什麼修改
AES_Encrypt(block, key);這裡用的encrypt法是哪種方法把key跟block結合

AES_Done();這又是幹什麼的? 通常block與key結合後應該就做完了

公不 2014-06-18 10:22 PM

引用:
作者crisliu2004
你可能要先搞懂

AES_Init();裡面做了什麼事

AES_ExpandKey(key);對傳進去的key做了什麼修改
AES_Encrypt(block, key);這裡用的encrypt法是哪種方法把key跟block結合

AES_Done();這又是幹什麼的? 通常block與key結合後應該就做完了

研究了2天

裡面還沒全懂

但是知道

AES_Init() ----->預先準備好要加密用的一些物件

AES_ExpandKey(key); 展開金鑰 用於加密時不要有重複 (但是前輩因為公司spec的需要 將此部份移除 )


AES_Encrypt(block, key);<----目前卡在 需要對block作額外的處理.填充額外的字元

AES_Done();整個加密完成.移除物件

昨天問的javascript

其實也是這個 '公司spec特殊'版的AES的需求

同樣用於塞入填充字元

因為改寫成java才知道用途

謝謝

還請提示該如何直接修正SimpleCrypto於

代碼:
private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/ZeroBytePadding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(clear);
return encrypted;
}

部分

對於傳入的raw做部分的填充


謝謝

KKao 2014-06-18 11:43 PM

居然可以在這裡看到有人用過 cyassl , 真是太訝異了

這我的team 有用,還實做了硬體加速器,pcdvd 果然是臥虎藏龍

傳說 2014-06-18 11:50 PM

raw是要加密的內容
那你為什麼要在加密函數中向raw中加東西???
要加密的內容應該在呼叫加密函數前就處理完成

PS.你的軟體設計概念很有問題
動不動就到處加一些針對性的程式碼
萬一以後需要維護的話會很辛苦....
去Google看一下耦合度的概念吧


所有的時間均為GMT +8。 現在的時間是09:52 AM.

vBulletin Version 3.0.1
powered_by_vbulletin 2025。