compute entropy

This commit is contained in:
Tykayn 2021-02-10 12:15:39 +01:00 committed by tykayn
parent e5411ab425
commit ddf5b40ef4
3 changed files with 100 additions and 15 deletions

View File

@ -3,7 +3,7 @@
Essais de chiffrement pour un framadate zéro knoledge Essais de chiffrement pour un framadate zéro knoledge
</h2> </h2>
<section class="boxed-shadow"> <section class="boxed-shadow">
<h3 class="title">Chiffrement simple</h3> <h3 class="title">1) Chiffrement simple</h3>
<div class="notification is-info"> <div class="notification is-info">
Les ordinateurs font des opérations très rapidement sur des nombres, pour coder et décoder des textes, il Les ordinateurs font des opérations très rapidement sur des nombres, pour coder et décoder des textes, il
suffit donc de les convertir en nombre et faire des opérations plus ou moins complexes avec. suffit donc de les convertir en nombre et faire des opérations plus ou moins complexes avec.
@ -32,6 +32,7 @@
</li> </li>
</ul> </ul>
<br /> <br />
On peut donc convertir notre texte en cette suite de nombres:
<strong class="cipher-result"> <strong class="cipher-result">
<app-copy-text [textToCopy]="simpleCipheredText" [displayLabelButton]="false"></app-copy-text> <app-copy-text [textToCopy]="simpleCipheredText" [displayLabelButton]="false"></app-copy-text>
<span> <span>
@ -39,7 +40,7 @@
</span> </span>
</strong> </strong>
<br /> <br />
<h3 class="title">Avec un peu de sel?</h3> <h3 class="title">2) Avec un peu de sel?</h3>
<input type="text" [(ngModel)]="salt" /> <input type="text" [(ngModel)]="salt" />
({{ salt.length }} caractères) ({{ salt.length }} caractères)
<br /> <br />
@ -50,7 +51,7 @@
<app-copy-text [textToCopy]="simpleCipheredTextWithSalt" [displayLabelButton]="false"></app-copy-text> <app-copy-text [textToCopy]="simpleCipheredTextWithSalt" [displayLabelButton]="false"></app-copy-text>
{{ simpleCipheredTextWithSalt }} {{ simpleCipheredTextWithSalt }}
</strong> </strong>
<h3 class="title">On hashe le sel</h3> <h3 class="title">3) On hashe le sel</h3>
<div class="columns"> <div class="columns">
<div class="column is-half"> <div class="column is-half">
Pour gagner en aléatoire on peut passer le sel dans une fonction de hashage cryptographique, telle que Pour gagner en aléatoire on peut passer le sel dans une fonction de hashage cryptographique, telle que
@ -78,7 +79,7 @@
</div> </div>
</div> </div>
<h3 class="title">Légèrement épicé</h3> <h3 class="title">4) Légèrement épicé</h3>
simple chiffrement avec un sel avant et un saupoudrage du sel sur chacun des caractères de la phrase. la valeur simple chiffrement avec un sel avant et un saupoudrage du sel sur chacun des caractères de la phrase. la valeur
du caractère est ajoutée à la valeur du caractère du sel correspondant. une fois arrivé à la fin du sel on du caractère est ajoutée à la valeur du caractère du sel correspondant. une fois arrivé à la fin du sel on
reprend au début pour saupoudrer toute la phrase à chiffrer. Ce qui donne reprend au début pour saupoudrer toute la phrase à chiffrer. Ce qui donne
@ -89,7 +90,7 @@
</strong> </strong>
<br /> <br />
<h3 class="title">On en remet une couche</h3> <h3 class="title">5) On en remet une couche</h3>
Les nombres que l'on a obtenu peuvent être transmis après une opération de conversion en caractères. On a donc Les nombres que l'on a obtenu peuvent être transmis après une opération de conversion en caractères. On a donc
autant de caractères que juste avant. ça ressemble déjà plus à un message pas évident à déchiffrer. Le nouveau autant de caractères que juste avant. ça ressemble déjà plus à un message pas évident à déchiffrer. Le nouveau
texte fait {{ layerOnSpread.length }} caractères. texte fait {{ layerOnSpread.length }} caractères.
@ -124,20 +125,73 @@
<!-- {{ simpleDeCipheredTextWithSpreadSalt }}--> <!-- {{ simpleDeCipheredTextWithSpreadSalt }}-->
<!-- </strong>--> <!-- </strong>-->
</section> </section>
<section class="boxed-shadow entropy">
<h2>Calcul d'entropie de Shannon</h2>
Un nombre élevé est signe de difficulté à deviner par calcul.
<table>
<thead>
<tr>
<td>score d'entropie</td>
<td>texte à évaluer</td>
</tr>
</thead>
<tbody></tbody>
<tr>
<td>{{ getEntropy(plainText).toFixed(3) }}</td>
<td>{{ plainText }}</td>
</tr>
<tr>
<td>{{ getEntropy(simpleCipheredText).toFixed(3) }}</td>
<td>
<p class="limited-text">{{ simpleCipheredText }}</p>
</td>
</tr>
<tr>
<td>{{ getEntropy(simpleCipheredTextWithSalt).toFixed(3) }}</td>
<td>
<p class="limited-text">{{ simpleCipheredTextWithSalt }}</p>
</td>
</tr>
<tr>
<td>{{ getEntropy(simpleCipheredTextWithHashedSalt).toFixed(3) }}</td>
<td>
<p class="limited-text">{{ simpleCipheredTextWithHashedSalt }}</p>
</td>
</tr>
<tr>
<td>{{ getEntropy(convertIntToText(simpleCipheredTextWithHashedSalt)).toFixed(3) }}</td>
<td>
<p class="limited-text">{{ convertIntToText(simpleCipheredTextWithHashedSalt) }}</p>
</td>
</tr>
<tr>
<td>{{ getEntropy(simpleCipheredTextWithHashedSpreadSalt).toFixed(3) }}</td>
<td>
<p class="limited-text">{{ simpleCipheredTextWithHashedSpreadSalt }}</p>
</td>
</tr>
<tr>
<td>{{ getEntropy(layerOnSpread).toFixed(3) }}</td>
<td>
<p class="limited-text">{{ layerOnSpread }}</p>
</td>
</tr>
</table>
</section>
<section class="is-boxed"> <section class="is-boxed">
<h3>Chiffrement AES</h3> <h3>Chiffrement AES</h3>
<app-wip-todo></app-wip-todo> <app-wip-todo></app-wip-todo>
<input type="text" [(ngModel)]="cipheredText" /> <!-- <input type="text" [(ngModel)]="cipheredText" />-->
texte avancé à déchiffrer <!-- texte avancé à déchiffrer-->
<br /> <!-- <br />-->
<input type="text" [(ngModel)]="salt" /> <!-- <input type="text" [(ngModel)]="salt" />-->
salt <!-- salt-->
<input type="text" [(ngModel)]="initial_vector" /> <!-- <input type="text" [(ngModel)]="initial_vector" />-->
initial_vector <!-- initial_vector-->
<br /> <!-- <br />-->
<input type="text" [(ngModel)]="key" /> <!-- <input type="text" [(ngModel)]="key" />-->
key <!-- key-->
</section> </section>
</div> </div>

View File

@ -25,3 +25,13 @@
.title { .title {
margin-top: 1em; margin-top: 1em;
} }
.entropy {
.limited-text {
max-width: 50% !important;
overflow: scroll;
text-overflow: ellipsis;
height: 2em;
display: block;
}
}

View File

@ -42,6 +42,9 @@ export class CipheringComponent implements OnInit {
get simpleCipheredTextWithHashedSalt() { get simpleCipheredTextWithHashedSalt() {
return this.convertTextToIntMixedSalt(this.md5(this.salt) + this.plainText); return this.convertTextToIntMixedSalt(this.md5(this.salt) + this.plainText);
} }
get simpleCipheredTextWithHashedSpreadSalt() {
return this.convertTextToIntMixedSalt(this.md5(this.salt) + this.plainText);
}
get layerOnSpread() { get layerOnSpread() {
return this.convertIntToText(this.simpleCipheredTextWithHashedSalt, false); return this.convertIntToText(this.simpleCipheredTextWithHashedSalt, false);
} }
@ -166,4 +169,22 @@ export class CipheringComponent implements OnInit {
md5(someText) { md5(someText) {
return CipherLib.md5(someText); return CipherLib.md5(someText);
} }
getEntropy(s) {
let sum = 0,
len = s.length;
this.process(s, (k, f) => {
const p = f / len;
sum -= (p * Math.log(p)) / Math.log(2);
});
return sum;
}
process(s, evaluator) {
let h = Object.create(null),
k;
s.split('').forEach((c) => {
(h[c] && h[c]++) || (h[c] = 1);
});
if (evaluator) for (k in h) evaluator(k, h[k]);
return h;
}
} }