• Nenhum resultado encontrado

3. Implementação

3.6. Implementação de um protocolo de teste

Um desafio necessário à retirada de conclusões sobre as implementações desenvolvidas foi a criação de um protocolo que permitisse devidamente testar a efectividade das técnicas aplicadas nos demonstradores realizados permitindo a comparação da efectividade das diversas contramedidas implementadas, tanto entre elas, bem como, por necessidade de comparação, com a implementação desprovida de qualquer um desses métodos.

Face a isto foi necessário considerar e realizar efectivamente uma acção concreta de ataque sobre os diversos demonstradores. Tendo em vista aos protocolos de ataque analisados anteriormente, no ponto 2.2, foi pensado o uso de um de dois métodos de medida do traçado de potência, o método proposto por Kocher et al em [4], [35] ou o método proposto por Kasper em [22].

Devido ao menor tempo de implementação do método descrito por Kocher, e também pelo facto de este poder fornecer directamente a informação necessária de uma forma de muito mais fácil compreensão, optou-se pela tentativa de execução deste. No entanto devido à impossibilidade de remoção de um componente da placa de desenvolvimento, cuja remoção era de absoluta necessidade para a colocação das pontas de provas que permitiam efectivamente executar as medidas, foi necessário a opção pelo recurso ao segundo método referido.

68

Imagem 50 - Montagem para medição

O recurso a este segundo método permite a aproximação a condições mais realistas face a um possível ataque por parte de terceiros a uma implementação da chave em uso, uma vez que não recorre a qualquer alteração física do componente, ou aparelho alvo do ataque, limitando-se a recolher a informação electromagnética cedida por ele durante o seu funcionamento como consequência directa do seu consumo energético, e usando este side- channel como base para o estabelecimento do ataque sobre a chave.

Como compromisso com o realismo do cenário atrás descrito, e pelo facto de este ataque ser executado sobre diverso demonstradores ao mesmo tempo, optou-se por usar também um sinal de trigger, fornecido pela transição de estados do demonstrador, da fase de comunicação para a fase de encriptação, representada para o utilizador como o acender de um LED, de modo a permitir maior facilidade no alinhamento do traçado (muito embora em ultima análise este passo não seria de forma alguma necessário uma vez que a transição de estado em conjunto com o accionamento do LED fornecem informação mais que suficiente no traçado recolhido para facilitarem o alinhamento).

Uma diferença crucial em relação ao método originalmente usado por Kasper diz respeito ao facto de não ser necessário o uso de qualquer tipo de recurso a desmodulação neste protocolo, uma vez que a medida não é feita a nenhum tipo de comunicação mas sim directamente ao consumo do componente.

69 Como tal foi usado, para estas medições, uma probe near-field pertencente ao conjunto de PBS-2 desenvolvido pela Aaronia, bem como o respectivo amplificador incluído no mesmo conjunto, ligados a um osciloscópio digital MSO4104 da Tektronix.

Para tornar funcional o uso destas ferramentas para análise, foi necessário criar todo um método de interface com o computador. Desse modo foi importante estudar e compreender o protocolo VISA, usado para comunicação via USB por diversos fabricantes de instrumentação, nomeadamente a Tektronix, a Agilent e National Intruments.

Foi também necessário estabelecer um modo de recolher a informação necessária das amostras transmitidas pelo osciloscópio para o computador. Para isso usou-se o Matlab, solução que oferece opções compreensivas para a implementação de qualquer tipo de cálculo necessário, bem como maior facilidade no estabelecimento de comunicações com diversa instrumentação, suportando facilmente a ligação ao osciloscópio através deste protocolo.

De modo a permitir o funcionamento coordenado da placa com o método de análise, facilitando a execução dos testes, tornou-se necessário coordenar o funcionamento das funções desenvolvidas em Matlab com a execução dos protocolos pensados por parte do terminal para o utilizador desenvolvido em C#. Como tal executou-se o deployment da biblioteca desenvolvida em Matlab para uma DLL compatível com as linguagens .NET, de modo a permitir a sua integração.

Da informação recolhida é necessário retirar várias conclusões, ou seja, analisá-la de forma a retirar vantagens de todo este processo. Acima da recolha directa do traçado de potência e da sua forma, o valor mais útil destas medições resume-se a dois factores, a média e a variância. Munidos destes factores, e através do tratamento de um grande número de amostras, um atacante pode esperar conseguir a chave ou, pelo menos, uma aproximação a esta.

Face ao conhecimento dos métodos usados para obter estas medições era então necessário descobrir qual o ponto da placa de desenvolvimento que deveria ser medido de modo a obter a menor interferência possível sobre a informação de interesse.

70

Imagem 51 - Esquemática regulador 5V para 1V da Xilinx XUPV5- LX110T

Na documentação referente à placa de desenvolvimento é referido que a lógica interna da FPGA é alimentada pelo barramento VCCINT. Com uma rápida pesquisa na esquemática da placa é possível descobrir que este é originário de um regulador 5V para 1V, correspondente a um PTH08T220W da Texas Instruments, como se pode ver na Imagem 51, que o alimenta exclusivamente e, como tal, é exactamente a esse ponto que queremos dirigir as nossas atenções.

Com recurso a uma probe de 6mm pertencente ao conjunto atrás referido abordou-se então a placa da forma que pode ser vista na Imagem 52.

71 Voltando ao nível do software, foram desenvolvidas rotinas em Matlab que permitiram a interacção e análise dos valores recolhidos pelo osciloscópio. No excerto de código presente na Imagem 53 podemos ver o modo como a abertura de comunicação com o instrumento é realizada.

Imagem 53 - Código de abertura de comunicação VISA (Matlab)

Posteriormente à abertura é necessário obter o sinal, uma vez que a aquisição é feita canal a canal, e se recorre a dois canais de modo a facilitar o alinhamento, bem como pelo facto de a aquisição ser feita de forma sincronizada com a comunicação, começa-se por adquirir o sinal de trigger e, de seguida, o sinal que desejamos analisar, proporcionando maior facilidade na sua análise. Na Imagem 54 podemos ver o código referente à aquisição de um canal por parte do computador.

Imagem 54 - Aquisição de um sinal (canal de trigger)

obj1 = instrfind('Type', 'visa-usb', 'RsrcName',

'USB0::0x0699::0x0401::c020252::0::INSTR', 'Tag', '');

% Create the VISA-USB object if it does not exist % otherwise use the object that was found.

if isempty(obj1)

obj1 = visa('AGILENT',

'USB0::0x0699::0x0401::c020252::0::INSTR'); else fclose(obj1); obj1 = obj1(1) end %canal trigger

fprintf(obj1,'DATA:SOURCE CH4'); %define source canal 4 (representa o trigger)

recordLength=query(obj1,'HORIZONTAL:RECORDLENGTH?','%s\n','%d');

%necessita de reajustar a dimensão do buffer de input

fclose(obj1);

obj1.InputBufferSize = recordLength; fopen(obj1);

%pede bin data

fprintf(obj1,'CURVE?');

72

Depois de executar a aquisição do sinal é necessário alinha-lo e calcular a informação que pretendemos recolher das medidas, como tal executa-se o código presente na Imagem 55.

Imagem 55 - Alinha traçado e calcula variância e média

Após a aquisição é necessário rearmar o trigger de modo ao osciloscópio estar à escuta de novos eventos. Para tal é necessário executar o pedido presente na Imagem 56.

Imagem 56 - Rearmar o trigger

Para coordenar com o terminal desenvolvido em C# e consequentemente com a comunicação, é preciso saber se o trigger foi ou não despoletado, bem como se o osciloscópio está a realizar ou não algum tipo de acção. Para isso, usa-se a função presente na Imagem 56.

O alinhamento da nossa janela de análise com a janela de tempo da encriptação pode ser considerado desta forma, sem prejuízo para a correcção de análise uma vez que como se pode ver antes do alinhamento na Imagem 57 e após a execução do alinhamento na Imagem 58 os picos correspondentes ao ligar e desligar do LED dizem respeito à janela de tempo da encriptação. Estes picos podem também ser vistos no próprio traçado de consumo uma vez mais na Imagem 58.

%alinha o traçado

ydataInt = ydata ((recordLength/2):MinIndex); fDataInt = ydataInt

%calcula a varância

varianciaInt = nanvar(fDataInt); fprintf(fVar,'%e',varianciaInt); fprintf(fVar,'\n');

%calcula a média

mediaInt = nanmean(fDataInt); fprintf(fMed,'%e',mediaInt); fprintf(fMed,'\n');

73

Imagem 57 - Canal do trigger (verde) e do sinal (amarelo) no oscilóscópio

Com a incorporação do código atrás descrito torna-se possível integrar estas medidas no terminal e no correspondente programa de testes já desenvolvido. Para esse efeito é necessário fazer o deployment das diversas funções Matlab com recurso à ferramenta Matlab Builder NE, que permite a geração de DLL .NET a partir de funções programadas em Matlab.

74

Imagem 58 – Dados alinhados à janela de tempo da encriptação

Com a inclusão desta DLL no código como parte constituinte do código tornou-se possível comunicar através da aplicação C# com o osciloscópio e com a placa, bem como expandir as funcionalidades de análise de dados desta, de modo a comportar a capacidade de executar e demonstrar os resultados da análise dos resultados.

Imagem 59 - Função que devolve o estado do osciloscópio

Retomando o Fluxograma 6, presente no ponto 2.3.2.2 pode-se começar a contextualizar o desenvolvimento do terminal neste ponto, devendo este esperar não só pela resposta da placa mas também pela do osciloscópio.

function busy = ocupado()

obj1 = instrfind('Type', 'visa-usb', 'RsrcName',

'USB0::0x0699::0x0401::c020252::0::INSTR', 'Tag', '');

if isempty(obj1)

obj1 = visa('AGILENT',

'USB0::0x0699::0x0401::c020252::0::INSTR');

else

fclose(obj1); obj1 = obj1(1);

end

% Connect to instrument object, obj1.

fopen(obj1);

busy = (query(obj1,'BUSY?')); fclose(obj1);

75 Para isso, foi necessário integrar um conjunto de funcionalidade no código para além da comunicação porta série, nomeadamente a inclusão da função presente na Imagem 59, bem como de uma que integre nela as restantes funcionalidades descritas neste ponto. Exigiu também a incorporação de novos modos de visualizar graficamente os dados recolhidos, nomeadamente através do traçar de gráficos de distribuição de pontos e de gráficos de linhas.

Imagem 60 - Janela Resultados

Estabeleceu-se deste modo a janela presente na Imagem 60 para permitir a execução destas tarefas.

Para descobrir a chave é necessário calcular, como atrás referido, a média e a variância, no entanto, para executar uma análise básica pode-se começar por considerar apenas a variância, procurando nela o pico mais alto de modo a encontrar a correspondente chave.

76

Imagem 61 - Função ataque básico

Com esta função é possível analisar graficamente os dados recolhidos e concluir do conjunto de seeds analisado o que mais se aproxima da chave usada no componente em análise.

O conjunto de seeds inicialmente escolhido representa a tentativa de analisar os casos mais extremos, grandes números de 1 ou 0, igualdade à chave escolhida ou completa negação da mesma, bem como exactamente metade de 0 e 1, dispostos de forma a obter o máximo de informação possível por este método. A Tabela 13 mostra o conjunto de todas as seeds escolhidas.

function

ataqueBasicoGraf(caminho1,caminho2,caminho3,caminho4,caminho5,camin ho6,caminho7,caminho8,titulo)

(…)

[A,c1] = fscanf(fA,'%e'); [B,c2] = fscanf(fB,'%e'); [C,c3] = fscanf(fC,'%e'); [D,c1] = fscanf(fD,'%e'); [E,c1] = fscanf(fE,'%e'); [F,c1] = fscanf(fF,'%e'); [G,c1] = fscanf(fG,'%e'); [H,c1] = fscanf(fH,'%e'); set(0,'Units','pixels')

scnsize = get(0,'ScreenSize');

figure('name',titulo,'Position',scnsize); subplot(2,1,1); grid on; grid minor; data = [A,B,C,D,E,F,G,H]; plotSpread(data,'xyOri', 'flipped','distributionColors',{'r','g','b','r','m','b','k','r'}); title('Distribuição das variâncias');

subplot(2,1,2); grid on; %grid minor; Med = [nanmean(A),nanmean(B),nanmean(C),nanmean(D),nanmean(E),nanmean(F), nanmean(G),nanmean(H)]; plot(Med);

title('Valor médio das variâncias');

77

Tabela 13 - Tabela de Seeds

Seed 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 A FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF (FF) B FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 (00) C 2B 7E 15 16 28 AE D2 A6 AB F7 15 88 09 CF 4F (3C) D D4 81 EA E9 D7 51 2D 59 54 08 EA 77 F6 30 B0 (C3) E 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF (FF) F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (00) G AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA (AA) H 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 (55)

Repare-se na situação presente na Imagem 62 em que, conhecendo ambos plaintext e chave, foram recolhidos 1024 amostras por plaintext de modo a permitir analisar e prever a partir destas análises, os resultados espectáveis no demonstrador sem qualquer tipo de contramedida. É possível ver que, sabendo que a seed número 3 corresponde ao valor mais alto de variância, sabe-se também que esta é a seed correspondente à chave o que é também um comportamento esperado.

Numa situação normal, em que a chave seria desconhecida, este ataque seria semelhante a um ataque com o plaintext conhecido, permitindo, neste caso, a aproximação ao valor da chave.

78

Expandindo a análise para se considerar a média dos consumos médios, também medidos durante a análise anterior, pôde-se obter, para a medição realizada anteriormente, o gráfico na Imagem 63.

Imagem 63 - Ataque básico demonstrador sem contramedidas com 1024 pontos por seed (média)

Pode-se visualizar também um pico no valor correspondente ao valor da chave, não sendo no entanto o pico mais alto.

Retomando a análise com recurso às variâncias desenvolveu-se um ataque sistemático baseado na sua análise. O funcionamento deste ataque pode ser visto no Fluxograma 9.

79 Inicio ataque sistemático Calcula variância plaintext A Calcula varância plaintext B Var(A)<Var(B)? A = B Bit = Bit + 1 B(Byte) = B(Byte) ^ Mascara(Bit) Sim B = A Bit = Bit + 1 B(Byte) = B(Byte) ^ Mascara(Bit) Não Byte = 0 Bit = 0 B = B ^ Mascara(Bit) B = A Bit < 16 Bit = 0 Byte = Byte + 1 Não Byte < 256 Sim Chave = B Fim Não Sim

Fluxograma 9 - Ataque sistemático

Este ataque baseia-se em procurar a variância mais alta através da alteração dos bits, convolvendo e testando as combinações de bits. O ataque tem um tempo relativamente reduzido de execução, bastando recolher amostras para 129 combinações diferentes dos 128 bits.

O seu tempo de execução, no entanto, é inversamente proporcional à sua eficiência uma vez que um maior número de amostras possibilita uma melhor aproximação à chave.

Para melhorar grandemente a eficiência e correcção deste ataque, uma vez que, como podemos observar através do gráfico presente na Imagem 62, por algum motivo a aproximação à chave pode não ocorrer como esperado. Foi combinada a execução do primeiro ataque, com o que neste momento está em execução, partindo já da seed com variância mais alta, ou seja a mais aproximada, para atingir o valor da chave.

80

Como é visível na Imagem 57, o ruido pode tornar-se uma parte importante da medição, podendo ser captados pela probe componentes rádio de sistemas de telecomunicações como a rede de telemóvel ou redes wireless. Uma vez que não era acessível um laboratório com um ambiente controlado face a estes componentes foi necessário encontrar uma solução que oferece-se um isolamento satisfatório. Para isso, recorreu-se à construção de uma rudimentar gaiola de Faraday, que pode ser vista na Imagem 64 em uso durante as medições, de modo a permitir alguma redução do ruido externo.

Imagem 64 - Setup com gaiola de Faraday

No entanto, as fontes externas não são as únicas a induzir componentes importantes de ruido no sinal desejado, a própria placa de desenvolvimento causa-os, gerando alguns componentes indesejados com o seu funcionamento. Componentes como o ruido térmico tornam-se relevantes com a duração dos testes, sendo de difícil eliminação e comprometendo a execução eficiente de, por exemplo, o ataque sistemático com um número exequível de amostras face ao tempo disponível.

81 Devido a isso, e para efeito de comprovação de funcionalidade das contramedidas, será analisada a alteração da variância e da sua inconstância para os diferentes plaintext, como ponto comprovativo da sua eficiência.

83