forked from tykayn/funky-framadate-front
compute entropy
This commit is contained in:
parent
e5411ab425
commit
ddf5b40ef4
@ -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>
|
||||
|
@ -25,3 +25,13 @@
|
||||
.title {
|
||||
margin-top: 1em;
|
||||
}
|
||||
|
||||
.entropy {
|
||||
.limited-text {
|
||||
max-width: 50% !important;
|
||||
overflow: scroll;
|
||||
text-overflow: ellipsis;
|
||||
height: 2em;
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user