Chương 3 : THỰC NGHIỆM
3.2 Tiến hành thực nghiệm
3.2.1Xây dựng chƣơng trình băm PRESENT
Chương trình PRESENT bao gồm các pha tính toán khóa, addRoundKey, … như mã nguồn bên dưới. Chương trình tham khảo tại [12]. Ngoài ra, trên trang lightweightcrypto.org còn chứa các mã nguồn khác của PRESENT theo các hướng cài đặt tối ưu trên phần cứng với khóa 64 bit, 128 bit (có cả mã nguồn bổ sung của S-Box 8 bit).
// ******************************************************************************
for(int round=0;round<32;round++){
subkey[round]= keyhigh;//61-bit shift trái
temp = keyhigh;
keyhigh <<=61;
keyhigh |=(keylow<<45);
keyhigh |=(temp>>19);
keylow =(temp>>3)&0xFFFF;
temp = keyhigh>>60;//S-Box
keyhigh &= 0x0FFFFFFFFFFFFFFF;
temp = sBox4[temp];
keyhigh |= temp<<60;
keylow ^=(((round+1)&0x01)<<15);
keyhigh ^=((round+1)>>1);
// ****************** Kết thúc pha tính toán khóa ************************************* // ****************** Mã hóa ***************************************************** for(i=0;i<31;i++){ // ****************** Pha addRoundkey ********************************************* state ^= subkey[i]; // ****************** Kết thúc pha addRoundkey ************************************* // ****************** Pha sBoxLayer ***********************************************
for(sBoxNr=0; sBoxNr <16; sBoxNr++){
sBoxValue = state &0xF;
state &=0xFFFFFFFFFFFFFFF0; state |=sBox4[sBoxValue];
state = rotate4l_64(state);
}
// ****************** Kết thúc pha sBoxLayer **************************************** // ****************** Pha pLayer **************************************************
temp =0;
for(int k=0;k<64;k++){
int position =(16*k)%63; // Hoán vị bit của p-Layer
if(k ==63)//Exception cho bit 63
position =63;
temp |=((state>>k)&0x1)<< position; //result writing
} state=temp; // ****************** Kết thúc pha pLayer ******************************************* } // ****************** Hàm addRoundkey vòng thứ 32 ********************************** state ^= subkey[31]; // ****************************************************************************** // ****************** Băm chuỗi có độ dài nhỏ hơn 64 bit ******************************
if(len (H)<64){
H = appendBit (H, len(H));
hashMess = hash (H, K);
}elseif(len (H)>64){// Băm chuỗi có độ dài lớn hơn 64 bit, sử dụng Merkle Damgard
IteratorH = Merkle (H);
numOfH = len (H)%64;
for(int i =0; i < numOfH-1; i ++){
newKey = makeNewKey(temp, K);
K = newKey;
hashMess = temp;
}
if(len (IteratorH[numOfH-1])<64)
{
H = appendBit (H, len(H));
}
hashMess = hash((IteratorH[numOfH-1]), K); }else { hashMess = hash (H, K); } // ****************************** Kết thúc băm ************************************ 3.2.2Tích hợp vào app di động
Build hàm băm PRESENT theo dạng thư viện tĩnh sau đó thông qua Jni để sử dụng như một thư viện của Java/Android. IDE sử dụng Android Studio ver 3.0. Cấu trúc sử dụng như hình 3.1 bên dưới:
Hình 3.1: Sử dụng Jni làm cầu nối để gọi qua lại giữa Java và C/C++