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
</h2>
<section class="boxed-shadow">
<h3 class="title">Chiffrement simple</h3>
<h3 class="title">1) Chiffrement simple</h3>
<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
suffit donc de les convertir en nombre et faire des opérations plus ou moins complexes avec.
@ -32,6 +32,7 @@
</li>
</ul>
<br />
On peut donc convertir notre texte en cette suite de nombres:
<strong class="cipher-result">
<app-copy-text [textToCopy]="simpleCipheredText" [displayLabelButton]="false"></app-copy-text>
<span>
@ -39,7 +40,7 @@
</span>
</strong>
<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" />
({{ salt.length }} caractères)
<br />
@ -50,7 +51,7 @@
<app-copy-text [textToCopy]="simpleCipheredTextWithSalt" [displayLabelButton]="false"></app-copy-text>
{{ simpleCipheredTextWithSalt }}
</strong>
<h3 class="title">On hashe le sel</h3>
<h3 class="title">3) On hashe le sel</h3>
<div class="columns">
<div class="column is-half">
Pour gagner en aléatoire on peut passer le sel dans une fonction de hashage cryptographique, telle que
@ -78,7 +79,7 @@
</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
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
@ -89,7 +90,7 @@
</strong>
<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
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.
@ -124,20 +125,73 @@
<!-- {{ simpleDeCipheredTextWithSpreadSalt }}-->
<!-- </strong>-->
</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">
<h3>Chiffrement AES</h3>
<app-wip-todo></app-wip-todo>
<input type="text" [(ngModel)]="cipheredText" />
texte avancé à déchiffrer
<br />
<input type="text" [(ngModel)]="salt" />
salt
<input type="text" [(ngModel)]="initial_vector" />
initial_vector
<br />
<input type="text" [(ngModel)]="key" />
key
<!-- <input type="text" [(ngModel)]="cipheredText" />-->
<!-- texte avancé à déchiffrer-->
<!-- <br />-->
<!-- <input type="text" [(ngModel)]="salt" />-->
<!-- salt-->
<!-- <input type="text" [(ngModel)]="initial_vector" />-->
<!-- initial_vector-->
<!-- <br />-->
<!-- <input type="text" [(ngModel)]="key" />-->
<!-- key-->
</section>
</div>

View File

@ -25,3 +25,13 @@
.title {
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() {
return this.convertTextToIntMixedSalt(this.md5(this.salt) + this.plainText);
}
get simpleCipheredTextWithHashedSpreadSalt() {
return this.convertTextToIntMixedSalt(this.md5(this.salt) + this.plainText);
}
get layerOnSpread() {
return this.convertIntToText(this.simpleCipheredTextWithHashedSalt, false);
}
@ -166,4 +169,22 @@ export class CipheringComponent implements OnInit {
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;
}
}