24小时热门版块排行榜    

查看: 842  |  回复: 0

轻叹12321

新虫 (初入文坛)

[求助] AES CPA

编写了AES加密算法的利用汉明距离模型的CPA攻击代码,现在仅可以攻击出第一,第五,第九,第十三字节的正确密钥(攻击位置为最后一轮S盒的输入),其余字节的密钥有错,求助大神到底哪里出错,改了好几天了,万分感谢~全部代码附上,其中original_data是利用另一段代码获得的功耗所做的表格。

keySize=8;
expectKey=17;
blockSize=128;
traceNum=1000;
startPoint=1;
endPoint=148002;
traceDir='..\mat';
matName='original_data'; % mat文件名  T3259_for_hspice_cf.mat
txtName='cipher1.txt'; % 明文或者密文文件名
load('../InvSbox.mat');
load('../HW8.mat');


%%
%
% 装载功率曲线, 生成有效功耗矩阵NxT
%
disp('Loading the power trace to generate NxT matrix ...');
eval(strcat('load(''',traceDir,'/',matName,''');'));
eval(strcat('AxT=',matName,';'));
eval(['clear ',matName,';']);
NxT=AxT(1:traceNum,startPoint:endPoint);%在所有的功耗曲线中取出我们要观测的矩阵,即实测能量迹
clear AxT;

%%
%
% 装载明文输入, 生成有效明/密文矩阵NxB
%
disp('Loading the plaintext to generate NxB matrix ...');
eval(strcat('fp = fopen(''',traceDir,'/',txtName,''',''r'');'));
db = fscanf(fp, '%s', 1);
FSIZE = length(db);
frewind(fp);
db = fscanf(fp, '%s');
fclose(fp);
NFILE = length(db) / FSIZE;
db = reshape(db,FSIZE,NFILE)';
NxB=zeros(traceNum,blockSize);
for i=1:traceNum
    FILELIST=db(i,;
    POS =  1;
    for j=1blockSize/4)
        NxB(i,j*4-3:j*4) = bitget(hex2dec(FILELIST(POS+j-1)), [4 3 2 1]);
    end
end
clear db;

%%
%
% 建立汉明距离或重量模型, 生成猜测功耗矩阵NxK
%
disp('Building the hypothetical power model to generate NxK matrix ...');
[N,T] = size(NxT);
K=2^keySize;
HD=zeros(N,K);
for candidate=1:K
    for trace_index=1:N
        DFFt2=NxB(trace_index,9:16);
        preXOR=bitxor(bitget((candidate-1),keySize:-1:1), NxB(trace_index,9:16));
        preSBOX=InvSbox(preXOR*[128 64 32 16 8 4 2 1]'+1);%转换成10进制,因为matlab从1开始,所以此处要加1
        DFFt1=bitget(preSBOX,keySize:-1:1);
        HD(trace_index,candidate)=bitxor(DFFt1,DFFt2)*[128 64 32 16 8 4 2 1]';
    end
end
NxK=HW8(HD+1);
clear HD;

%%
%
% 计算Pearson相关系数, 生成相关系数矩阵KxT
%
disp('Calculating the correlation to generate KxT matrix ...');
KxT=zeros(K,T);
chunksize=50;
chunks=T/50;
first=1;
last=K;
for i=first:last % 遍历密钥搜索空间
    for j=1:chunks
        cmatrix= corrcoef([NxT(:,1+(j-1)*chunksize:j*chunksize)  NxK(:,i)]);
        KxT(i,1+(j-1)*chunksize:j*chunksize) =cmatrix(chunksize+1,1:chunksize);
    end
end
%clear NxK;

%%
%
% 进行统计分析
%
TxK=KxT';
clear KxT
[max_corr_each_key,max_index_each_key]=max(TxK);
[max_corr,max_index]=max(max_corr_each_key);
point_of_max_corr=max_index_each_key(max_index);

%%
%
% 打印结果
%
fprintf('\n--------------- RESULT @%d TRACES FROM %s --------------\n',traceNum,matName);
fprintf('RK = %d%d%d%d_%d%d%d%d\n',bitget(max_index-1,8:-1:1));
fprintf('Max correlation = %d\n',max_corr);
fprintf('The index of point sequence of max correlation = %d\n',point_of_max_corr+startPoint-1);
fprintf('Percentage = %d %%\n',(point_of_max_corr/T)*100);
toc;
回复此楼

» 猜你喜欢

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 轻叹12321 的主题更新
信息提示
请填处理意见