Quelques problèmes de cryptage à résoudre.

Partagez votre expérience de PureBasic avec les autres utilisateurs.
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Quelques problèmes de cryptage à résoudre.

Message par PAPIPP »

Bonjour à tous

Voici la solution en alphanumérique du 2em pb . le message est réparti entre 3 personnes
Il y a donc !3=6 permutations pour décoder. Voyez l' exemple ci dessous :

Code : Tout sélectionner

Macro _q_t_
"
EndMacro
Macro _n (__n)
_q_t_#__n#=_q_t_+Str(__n)+" "
EndMacro
Macro _s (__S)
_q_t_#__S#=_q_t_+__S+" "
EndMacro

Procedure.l STRINGtoBSTR(String$)
  EnableExplicit
  Protected Result = 0
  CompilerIf #PB_Compiler_Unicode
    Result = SysAllocString_(@String$)
  CompilerElse
    Protected *buff = AllocateMemory(Len(String$)*2 + 4);; modif PAPIPP pour ^étre conforme au BSTR
    If *buff
      PokeS(*buff, String$, -1, #PB_Unicode)
      Result = SysAllocString_(*buff)
      FreeMemory(*buff)
    EndIf
  CompilerEndIf
  ProcedureReturn Result
  DisableExplicit
EndProcedure

Procedure.s KEYGEN(LONG_CAR, DEB_RANDOM, deb_car,fin_car) 
  EnableExplicit
  ; Générateur de clé aléatoire :
  ; Long_car longueur de la clé si possible de même longueur que le message à crypter
  ; DEN_RANDOM SI zero pas de randomseed 
  ;            SI <>0 randomseed car RandomSeed() n'est utile que lorsque l'objectif est de générer des nombres aléatoires 
  ;              dans le même ordre à chaque fois que le programme est exécuté.
  ; deb_car N° ASCII du début de table des caractère ASCII de 0 à 255 mais 0 est dans tous les cas éléliminé et remplacé par 1
  ; fin_car N° ASCII de la fin de la table exemple pour être sûr d'avoir des caractère visibles et éditable deb_car =32 et fin_car=126
  ;                    pour les valeurs numériques 1234567890  donnez  deb_car = 48 et fin_car =57 
  ; sortie en UNICODE pour générer par la suite une clé avec une structure BSTR car XOR peut générer chr(0)
  ;                   et donc rendre toutes les instructions PB sur string pratiquement inutilisables.
   Define i,  length , cle$ ,nb
  CompilerIf #PB_Compiler_Unicode
    ;;;; univers UNICODE
  CompilerElse 
    ;;;;; Univers NON UNICODE
    MessageRequester("ATTENTION", " Vous devez Compiler en mode UNICODE")
    End
  CompilerEndIf     
  Static FLAG_KEYGEN=0
  If FLAG_KEYGEN=0
    ;;;********* On peut retiter le blanc qui a une probabilité de 27% donc avec des risques de collision ****************
  Static alphabet$="abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,;:!<>?./§&é'(-è_çà)=~#{[|`\@]}+°%ù*µ^$£²"+Chr(34)
  For i=160 To 255 
    alphabet$+Chr(I)
  Next 
  FLAG_KEYGEN+1
  EndIf
  If deb_car<1
    deb_car=1
  EndIf 
  If fin_car>255 
    fin_car=255
  EndIf
  If deb_car>fin_car 
    deb_car=fin_car
  EndIf  
If fin_car=0
  length=Len(alphabet$ )
  Dim tab.c(length-1)
  For i=0 To length-1
    tab(i)=PeekC(@alphabet$+i*2) ;;;; Peekc définit l'adresse en octets alors que chaque élément de tab.c() est sur 2 octets
  Next
;   SortArray(tab(),#PB_Sort_Ascending ) ;;; pour mise au point et  vérifier qu'il n'y a pas de doublon 
 fin_car=length-1
 deb_car=0

Else
  Dim tab.c(fin_car-deb_car)
  For i=0 To fin_car-deb_car
    tab(i)=I+deb_car
  Next
EndIf

If DEB_RANDOM<>0
RandomSeed(DEB_RANDOM)
EndIf

RandomizeArray(tab())
cle$=""
For i=1 To LONG_CAR 
  nb=Random(fin_car,deb_car)
  CLE$+Chr(tab(nb-deb_car))
Next  
ProcedureReturn cle$
DisableExplicit
EndProcedure

Procedure.l KEYGEN_BSTR(LONG_CAR, DEB_RANDOM, deb_car,fin_car)
  ;   ; sortie en BSTR pour générer une clè  BSTR car XOR peut générer chr(0) (Collision)
  ;   ;                 ces collisions peuvent rendre toutes les instructions PB sur string pratiquement inutilisables 
  ;;;;;         donc utilisation de la structure BSTR
  ProcedureReturn  STRINGtoBSTR(KEYGEN( LONG_CAR, DEB_RANDOM, deb_car,fin_car))
EndProcedure  
Procedure.l XORALPHA(*CENT.string,*CPAW.string)
  EnableExplicit
;   ;Shared ou Global (voir aussi: Protected et Static).
  Protected LONG=PeekL(*cent-4)
  Protected Result,*ASORT.string=AllocateMemory(LONG+8);;,Cpass.s=space(200)
  If PeekL(*cent-4)<>PeekL(*CPAW-4)
    MessageRequester("ATTENTION"," Pour le moment les 2 chaines doivent avoir la même longueur")
    End
  EndIf  
  PokeS(*asort+4,Space(long/2))
  Result = SysAllocString_(*ASORT+4)
  CopyMemory(*CPAW-4,result-4,LONG+4);;; Pour convention BSTR l'adresse pointe sur la chaine et la longueur est à l'adresse -4
  FreeMemory(*ASORT)
 LONG=(LONG/4)+1
 EnableASM
  MOV esi, *CENT
  MOV edi , Result
  MOV ecx, LONG
  !lab1:
  MOV eax, [esi]
  XOR [edi], eax 
  ADD esi,4 
  ADD edi,4
  LOOP lab1
  DisableASM
  ProcedureReturn result
  DisableExplicit
EndProcedure 
  Procedure.l EGALLONG(*CENT.string,*CPAW.string)
    Protected lcent,lcpaw,difl
    lcent=PeekL(*CENT-4)
    lcpaw=PeekL(*CPAW-4)
    difl=Sign(lcent-lcpaw )
    Select difl
      Case 0
        ProcedureReturn *CPAW 
      Case 1 
        passwrd.s="" 
        For y= 0 To Lcent-2  Step 2
          pos=y%lcpaw
          passwrd.s+PeekS(*CPAW+pos,1)
        Next
        ProcedureReturn STRINGtoBSTR(passwrd)
      Case -1
        PokeL(*CPAW-4,PeekL(*CENT-4))
        ProcedureReturn *CPAW
    EndSelect      
   EndProcedure  
; 
chaine.s="toto de la Lune"+Chr(10)+"a la ligne"
K2.s="tito"
K3.s="pierre"
lchaine=Len(chaine)
; K2.s=rallonge_paw(K2,lchaine)
; K3.s=rallonge_paw(K3,lchaine)
*chaine=STRINGtoBSTR(chaine)
*K2=STRINGtoBSTR(K2)
*K3=STRINGtoBSTR(K3)
*K2=EGALLONG(*chaine,*K2) ;;; la longueur doit être la même que celle de la chaine 
*K3=EGALLONG(*chaine,*K3) ;;; la longueur doit être la même que celle de la chaine
Debug "la chaine en clair= "+chaine.s
Debug "le password= K2="+K2.s; +_n(Len(K2))
Debug "le password= K3="+K3.s; +_n(Len(K3))
Debug ""
Debug ""

; on encode la chaine avec le mot de K2
*R2=XORALPHA(*chaine,*K2)
Debug "le resultat encodé= "+PeekS(*R2)
Debug ""
*K1=XORALPHA(*R2,*K3)

;;; A envoie K1 et K2 et K3 au 3 personnes

;;; ***** décodage OK malgré le mauvais ordre de decodage
*R2b=XORALPHA(*K2,*K3)
; Debug "le resultat décodé= "+PeekS(*R2b)
*R1b=XORALPHA(*R2b,*K1)
Debug "**** Bon résultat  avec XORALPHA quelque soit l'ordre de décodage *K2 !  *K3  ! *K1*****"
Debug PeekS(*r1b)

;;; ***** décodage OK malgré le mauvais ordre de decodage
Debug ""

*R2b=XORALPHA(*K1,*K2)
; Debug "le resultat décodé= "+PeekS(*R2b)
*R1b=XORALPHA(*R2b,*K3)
Debug "**** Bon résultat  avec XORALPHA quelque soit l'ordre de décodage  *K1 ! *K2 ! *K3 *****"

Debug PeekS(*r1b)


;;; Bon ordre de décodage résultat OK
*R2b=XORALPHA(*K1,*K3)
; Debug "le resultat décodé= "+PeekS(*R2b)
*R1b=XORALPHA(*R2b,*K2)
Debug "**** Bon résultat ordre de décodage OK   *K1 ! *K3  ! *K2   ******"

Debug PeekS(*r1b)

Debug ""

*R2b=XORALPHA(*K2,*K1)
; Debug "le resultat décodé= "+PeekS(*R2b)
*R1b=XORALPHA(*R2b,*K3)
Debug "**** Bon résultat  avec XORALPHA quelque soit l'ordre de décodage   *K2 ! *K1  ! *K3   ******"

Debug PeekS(*r1b)
Debug ""

*R2b=XORALPHA(*K3,*K1)
; Debug "le resultat décodé= "+PeekS(*R2b)
*R1b=XORALPHA(*R2b,*K2)
Debug "**** Bon résultat  avec XORALPHA quelque soit l'ordre de décodage   *K3 ! *K1  ! *K2   ******"
Debug PeekS(*r1b)
Debug ""

*R2b=XORALPHA(*K3,*K2)
; Debug "le resultat décodé= "+PeekS(*R2b)
*R1b=XORALPHA(*R2b,*K1)
Debug "**** Bon résultat  avec XORALPHA quelque soit l'ordre de décodage   *K3 ! *K2  ! *K1   ******"
Debug PeekS(*r1b)

Debug ""

debug ""
debug ""
debug "**** Toutes les permutations ont été réalisées  et les résultats sont OK ********"

A+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Quelques problèmes de cryptage à résoudre.

Message par Zorro »

@PAPIPP ,

je n'ai jamais dit que ma solution pouvait fonctionner avec les codes de 0 a 255
mais tu parlais "Alpha-numerique" , ce qui chez moi correspond a l'ecriture d'un Texte

hors dans ce cas, on utilise generalement les codes 32 a 126 ...

et dans ce cadre d'utilisation (le cryptage d'un message ) ma solution fonctionne tres bien !
le code 255 etant a ma connaissance tres peu utilisé dans un Texte ....
de plus je teste si il y a collision entre le caractere a coder et le caractere du mot de pass ,
il ne peut donc jamais se produire ... puisque je remplace le fameux "0" par 255 (qui signifie au decodage d'utiliser la lettre du mot de pass en remplacement ) :)

le resultat encodé XOR entre un caractere du text (entre 32 et 126 ) ne produira jamais "255"
j'ai fais plein de testes pour vérifier , mais si tu arrives a me demontrer que c'est possible
je trouverai probablement une solution ...


par contre , effectivement pour un codage de fichier par exemple , on se retrouve avec des codes possible entre 0 et 255 (octets )
mais on doit pouvoir affectuer le meme systeme en utilisant dans ce cas une valeur qui sort du cadre 0-255 en utilisant par exemple
une valeur bien plus grande , ou carrement un Flag de nature differente... (un mot, une suite de code bien precis ) au lieu du fameux 255 ... :)
cette "suite de codes" indiquant qu'au decodage, il faut prendre la lettre du Password au lieu du "code"....
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Quelques problèmes de cryptage à résoudre.

Message par Zorro »

hier sur la 3 , un tres bon film est passé "Imitation Game "
avec Benedict Cumberbatch (Sherlock Holmes )

ça retraçait la vie de Alan Turing , son action concernant le décryptage de "Enigma" pendant la 2em guerre mondiale

il est aussi le pere de l'informatique moderne
j'ai passé un bon moment :)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Quelques problèmes de cryptage à résoudre.

Message par PAPIPP »

@Zorro

Oui je considère l’alphanumérique pour tout caractère qui peut être introduit dans une variable de type xxx$ ou xxx.s ce qui nous donne en Ascii 1-255 ou $1-$FF et en Unicode 1-65535 ou $1-$FFFF
Le zéro étant considéré comme une fin de chaine en PB.

Les caractères ,de la chaine à crypter qui nous est soumise, peuvent appartenir à tout l’ensemble de l’alphanumérique défini ci-dessus.
Par contre l’alphabet de référence pour écrire ou générer un mot de passe peut être réduit.
Mais cela est réalisé au détriment de la robustesse du codage.

Enfin comment fais-tu avec ton prg pour retrouver l’ordre exacte pour décoder dans le 2em problème si le nombre de personnes et supérieur à 6 nombre d’essai =>!6 =>720 essais

A+

Ps : pour la solution du 3em il y a surcodage et l’ordre de décodage est pratiquement imposé par le pb et l’une de ses solutions. Je n’en ai trouvé qu’une pour l’instant.

Oui Alan Turing était un grand mathématicien et cryptologue britannique, auteur de travaux qui fondent scientifiquement l'informatique. La machine de Turing et le test de Turing en sont des exemples.
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Quelques problèmes de cryptage à résoudre.

Message par Zorro »

PAPIPP a écrit : Par contre l’alphabet de référence pour écrire ou générer un mot de passe peut être réduit.
Mais cela est réalisé au détriment de la robustesse du codage.
ben Enigma n'utilise que les 26 lettres de l'alphabet, et ça a résisté un sacres moment ....
et ceux seulement parceque la clef avait été donnée chaque moi par un agent double ...
Enfin comment fais-tu avec ton prg pour retrouver l’ordre exacte pour décoder dans le 2em problème si le nombre de personnes et supérieur à 6 nombre d’essai =>!6 =>720 essais
je te dois un aveu , je n'ai pas compris l’énoncé de tes problemes .... (d'ailleurs c'est souvent ça, mon probleme )
car dans ta formulation du probleme tu melanges allegrement les termes "clef", "cadenas" , "coffre"
je ne suis pas arrivé a determiner qui etait quoi ....

mais c'est pas vraiment important , en cryptologie , il y a pas 36 ecoles
soit
on parle de chiffrage asymétrique (clef publique, clef privé )
ou symétrique (simple mot de pass) comme le protocole XOR que tu utilises

on parle aussi de Sur-chiffrage (sur encodage) , la machine Enigma etait un parfait exemple de Surencodage (sur chiffrage ) mais c'etait aussi du symétrique en fait

donc la solution de tes problèmes passe invariablement par l'une de ces ecoles !

apres tu ne précisais pas exactement l'information a chiffrer , comme je le dis ,

soit on chiffre des caractères Alpha-numerique, c'est a dire les caractères imprimable (un texte ) (comme pour le codage "Vigenere" ou bien le codage "Cesar" ou enigma )

soit on chiffre du binaire (Octets ,Mot, Mot long ) (une image, un prg, ou meme un fichier Text mais par son coté "File" pas "Textuel"
forcement le chiffrage, et son decodage, n'aura pas le meme role ....

pour ce qui est du partage entre plusieurs membres, c'est du "décorum"
car rien n'empeche de scinder en morceau le fichier encodé , ou/et la Clef entre plusieurs personne
comme un puzzle qu'on assemble pour faire une clef qui ouvre une porte, ou un Livre dont chacun aurait une page....
bref le syndrome "carte au tresor" de l'ile au Trésors ... :)
chacun pouvant avoir une "clef" ou information indiquant l'ordre dans lequel ça s'emboite
comme les Paquets TCP IP qui se remettent en ordre pour delivrer la message final
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Quelques problèmes de cryptage à résoudre.

Message par PAPIPP »

@ Zorro
pour ce qui est du partage entre plusieurs membres, c'est du "décorum"
Je répond certainement pas . Voyons le pb en détail en prenant comme exemple avec pour mot de passe toto ;et pour CODE du coffre Codecoffre$="2a 1b" ;; 2 roues.
N’oublions pas qu’avec 2 ou N personnes, nous envoyons 2 ou N mot de passe ou clé (difficile de faire la différence entre clé et mot de passe dans ce pb )
si CODE est le code du coffre à trouver les autres partie du pb s’appellent mot de passe ou clé. Le résultat de K1=Code  K2 avec K2=toto et K1 résultat,
K1 et K2 sont envoyés aux 2 personnes jusqu’ici pas de souci.
Mais avec N personnes qu’est que tu découpes K1 en (N-1) morceaux ou K2=toto aussi en N-1 morceaux ou carrément le CODE du coffre en N morceaux.

Suivant le choix nous aurons des algo différents le mot de passe et le CODE du coffre sont trop petit pour être découpés surtout si nous avons plus de 6 personnes.
On peut toujours augmenter le nb de caractère du mot de passe jusqu’à dépasser celui du CODE.

Et inverser CODE et mot de passe on va donc étendre CODE jusqu’à obtenir la même longueur que mot de passe et avec K1=Code_étendu  K2
avec K2 mot de passe long, CODE_étendu au nombre de caractères de mot de passe. Et que découpe-t-on dans ce pb K1 ou K2 ou CODE_étendu ?

S’il manque 1 personne les N-1 personnes qui recevront des codes de longueurs différentes suivant le choix de découpe :
1) soit K1 découpé en N-1 à reconstituer mais dans quel ordre (longueur différentes) K2 entier
2) soir K2 découpé en N-1 à reconstituer mais dans quel ordre (longueur différentes) K1 entier
avec des longueurs différentes pour connaitre l’ordre il sera facile de savoir quel code manque
et si les longueurs sont identiques quel ordre devront-ils choisir ?

On peut remarquer que nous allons vers des difficultés importantes même s’il ne manque personne

Il faudra :
1) un prg d’allongement du CODE
2) Le prg de codage décodage.(codage)
3) Un prg de découpage en N-1 parties
4) Un prg de reconstitution des N-1 parties (retrouver l'ordre)
5) Le prg de codage décodage.(décodage
6) Un prg pour retrouver le CODE d’origine (en supposant que le code d’allongement ne soit pas
trop simple car s’il manque une personne celui-ci peut être facilement lu si l’algo est trop simple

Tout cela pour résoudre un problème de CODE de coffre (petite longueur)

Mais pour résoudre l’envoie d’une lettre comportant des secrets les procédures seront différentes et certainement simplifiées.
En effet une lettre secrète aura généralement un nombre de caractères important
et le programme d’allongement du mot de passe est transparent pour l’utilisateur final alors que le CODE_étendu ne l’est pas
car c’est dans ce code qu'il trouve son bonheur.

On ne pourra ni généraliser ni automatiser ces 2 procédures car nous ne saurons jamais dans quel cas nous sommes.
Le message à trouver est-il petit ou grand ? Plus le message est petit plus la difficulté est grande.

De plus il faut pour conserver une robustesse suffisante avoir autant de possibilité de reconstituer le CODE ou la lettre secrète s’il manque 1 ou N-1 personnes.
Ce qui ne semble pas être le cas ici.

Pour le 3em pb l’exemple qui est proposé, l’est pour montrer que l’on peut échanger des bijoux entre 2 personnes sans que celui qui reçoit les bijoux ait la clé du cadenas de l’autre,

En traduction informatique.
Comment envoyez un message crypté à une tierce personne sans que cette personne n’ait ni le prg ni le mot de passe de celui qui lui a envoyé. On n’utilise pas non plus de clé publique.
Il faut évidemment des caractéristiques identiques à chacun des prg mais la ou lesquelles.
Le prg de l’envoyeur et celui du récepteur peuvent être différents mais ils ont une même caractéristique.

En reprenant le pb du coffre envoyé par Bernard à Alice vous avez les éléments qui permettent de trouver la solution informatique

A+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Quelques problèmes de cryptage à résoudre.

Message par Zorro »

Je suis deja certain que lorsque tu donnera la solution de tes problemes
je démontrerai que j'ai deja donné la solution ! ou du moins que j'ai deja parlé de la mise en oeuvre .... wait and see ;)

tes problemes me donne l'impression d'un elephant qui va accoucher d'une souris ... mais je suis peut etre un poil moqueur
fidele a moi-meme :lol:

deja le fait de parler de donner le contenu du coffre a X , et la Clef a Y pour dire que tu separes en deux , me semble
legerement "Amplifier" un probleme qui n'en est pas ....

en general pour ouvrir un coffre, il faut le coffre ET la clef .... et c'est bien la meme personne
sinon , c'est un portier ... ou saint Pierre :mrgreen: si tu n'as que la clef

encore, il aurai fallu etre deux pour reconstituer le coffre , ou la clef , j'aurai compris ....

quoiqu'il en soit, on ne peut diviser a l'infini un coffre (son contenu) et/ou une clef ...
ça n'a pas de sens ....
en principe on est peut nombreux a avoir une clef (Club,Confrérie,etc...)

sinon on retombe sur le principe de la clef Publique , tout le monde a la meme :

ou éventuellement chaqu'un a une clef différente , et que ces Clef Additionnées deviennent une super Clef qui ouvre le coffre

ou bien éventuellement une clef "de licence" avec un code Spécifique a ton matériel informatique
lecture de numero de carte mere ou du numero du disque dur ...( on en a deja parlé ici meme )

ou la reconstitution d'une clef se fait en utilisant le numero de ton materiel , ton prg coffre fort contient un complément de clef
inclu en lui meme et ton materiel fait le complément pour avoir la super Clef qui ouvre le coffre fort


Bref , je donne ma langue au chat :)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Quelques problèmes de cryptage à résoudre.

Message par PAPIPP »

Bonjour à tous

Voici le récapitulatif des 3 problèmes avec pour chacun une solution numérique.
Il vous restera à trouver la solution alphanumérique. Surtout pour le 3em puisque pour les 2 premiers j’ai déjà donné une solution.
Tout est à base de XOR, opérateur commutatif et associatif, et dans ces 3 pb il fallait trouver la procédure d’utilisation du XOR.
Certains pensent que xor est une méthode simpliste et peu robuste.
Je peux vous mettre au défit de trouver un code de 8 octets en hexa voire un texte en français ou en anglais codé avec xor numérique.
pour le premier et XOR alphanumérique pour le second.

Par exemple pour l’option numérique sur 8 octets en hexa il y a 256 possibilités par octets ce qui fait :
Pow(256,8) =$FFFFFFFFFFFFFFFF ou Pow(2,64) = 18446744073709551616 une paille.

Random() est limité par son type integer donc $7FFFFFFF en 32 bits et $7FFFFFFFFFFFFFFF en 64 bits ,
mais rien ne vous empêche de créer un générateur de nombre aléatoire ou d’utiliser en 32 bits la concaténation du résultat de 2 appels de random().

Les 3 problèmes :
1) Vous avez un coffre qui contient de l’argent et des bijoux et celui-ci s’ouvre avec une clé secrète (code) que vous désirez transmettre à 2 personnes
de façon que chacune d’entre-elles ne puissent accéder à l’ouverture du code sans l’aide de l’autre.
Il faut que les deux personnes soient d’accord et présentes.
La méthode pour retrouver le code leur a été fourni, elle fait partie du problème.
Pour garder le plus de robustesse vous ne coupez pas le code en deux mais vous envoyez à chacune d’elle un texte crypté qui contient le code entier cryptée donc non lisible.
Comment faites-vous ?

Solution
Soit A le détenteur du code du coffre et B et C les personnes qu’il désire associer.
Ici le processus est de crypter le code et d’envoyer à B la clé de cryptage ou le mot de passe par exemple et à C le résultat par XOR
Ce qui se réalise assez rarement car envoyer la clé de cryptage ou le mot de passe est surprenant. On a plutôt envie de le conserver précieusement.


Code : Tout sélectionner

Macro _q_t_
"
EndMacro
Macro _n (__n)
_q_t_#__n#=_q_t_+Str(__n)+" "
EndMacro
Macro _s (__S)
_q_t_#__S#=_q_t_+__S+" "
EndMacro

DEbug "******** Chez   A  ***********"
M_A.Q=$1C02B  ;;; 2 roues au code du coffre
; CLE_A.Q=$EDCA98701;;; il n'est pas nécessaire d'imposer une clé
; randomseed($7FFFFFFF) ;;;; pour générer le même nombre aléatoire cette instruction n'est pas nécessaire pour ce problème.
CLE_A.Q=random($7FFFFFFF) ;;; A peut par sécurité conserver la clé CLE_A chez A mais cela n'est pas nécessaire.
;;                            limité à $7FFFFFFF en 32 bits et à $7FFFFFFFFFFFFFFF en 64 bits 
A_CRYPTE.Q=M_A ! CLE_A
debug "***  Chez A M_A message M_A.Q="+" en Hex="+HEX(M_A)
debug "et A envoie à B la clé  CLE_A.Q  en Hex="+HEX(CLE_A)
debug "         et à C le résultat de M_A ! CLE_A= A_CRYPTE.Q en Hex="+HEX(A_CRYPTE)
debug "*************************************************"
debug ""
DEBUG "** Donc B reçoit en Hex="+HEX(CLE_A)
debug "**   et C reçoit en Hex="+HEX(A_CRYPTE)

debug ""
Debug "*** il suffit maintenant que B et C soit d'accord devant un tiers pour prouver leur accord et  pour retrouver le code d'origine "

debug "*************** Chez une tierce personne  B et C recompose le code *************"
code_recu.q=A_crypte ! CLE_A
debug "code_recu.q=A_crypte ! CLE_A en Hex="+HEX(code_recu)+" Comparé au code à l'origine en Hex="+HEX(M_A)

debug " *** On retrouve le code d'origine en Hex="+HEX(M_A) +" avec le code reçu Hex="+HEX(code_recu)+" Elémentaire mon cher Watson !!!! "
debug "                                                                    Oui bien sûr mais quant est-il avec un code alpha-numérique ????"


2) On peut généraliser la méthode que vous aurez trouvée à N personnes.
Comment faites-vous pour distribuer un code crypté à N personnes,
sachant qu’il est nécessaire que toutes ces personnes soient présentes pour trouver le code ?

Solution
A crée N-1 clés aléatoires K2 K3 ….. Kn et K1 résultat du cryptage du message ou du code avec toutes les clés aléatoires
K1=Mo  K2  K3  K4  K5 ………………  Kn
Et on envoie K1 K2 K3 K4 K5 …. Kn aux N personnes
Qui pour retrouver le code réaliseront
Mo= K1  K2  K3  K4  K5 ………………  Kn
en numérique nous n’avons aucun pb puisque 0 fait partie du nombre
Mais en alphanumérique il faut que XORALPHA ait les mêmes caractéristiques que xor

Code : Tout sélectionner

Macro _q_t_
"
EndMacro
Macro _n (__n)
_q_t_#__n#=_q_t_+Str(__n)+" "
EndMacro
;;Maintenant on à 4 personnes qui doivent partager le code  A propriétaire du code B, C, D, E les 4 personnes qui reçoivent une partie du code
;;Chez A M_A message M_A.Q=123456789
; Il faut générer un nombre de clés aléatoires correspondant aux nombre de personnes -1
;; donc avec 4 personnes nous allons générer 3 clé aléatoires
L’exemple suivant est réalisé avec 4 personnes

M_A.Q=$1C02B
; CLE_A.Q=$EDCA98701;;; il n'est pas nécessaire d'imposer une clé
; randomseed($7FFFFFFF) ;;;; pour générer le même nombre aléatoire cette instruction n'est pas nécessaire pour ce problème.
CLE_B.Q=random($7FFFFFFF) ;;; A peut par sécurité conserver la clé CLE_B chez A mais cela n'est pas nécessaire.
CLE_C.Q=random($7FFFFFFF) ;;; A peut par sécurité conserver la clé CLE_C chez A mais cela n'est pas nécessaire.
CLE_D.Q=random($7FFFFFFF) ;;; A peut par sécurité conserver la clé CLE_D chez A mais cela n'est pas nécessaire.

; A va avec ces 3 clés générer la clé  qui permettra de code le message ou le code

CLE_E.Q=M_A !(CLE_B ! CLE_C) ! CLE_D

debug "***  Chez A M_A message M_A.Q="+" en Hex="+HEX(M_A)+ "  *****"  
debug "Il faut générer un nombre de clés aléatoires correspondant aux nombre de personnes -1"
debug " donc avec 4 personnes nous allons générer 3 clés aléatoires"
debug "A va avec ces 3 clés et M_A générer la clé E CLE_E qui sera envoyé à E"
debug  " CLE_E.Q=M_A !(CLE_B ! CLE_C) ! CLE_D  ="

debug "et A envoie à B la clé  CLE_B.Q  en Hex="+HEX(CLE_B)
debug "         et à C la clé  CLE_C.q  en Hex="+HEX(CLE_C)
debug "         et à D la clé  CLE_D.q  en Hex="+HEX(CLE_D)
debug "         et à E la clé  CLE_E.q  en Hex="+HEX(CLE_E)

; 
debug "" 
Debug "*** il suffit maintenant que B C D et E  soient d'accord devant un tiers pour prouver leur accord et  pour retrouver le code d'origine "
debug " CODE_RECU.Q=(CLE_E ! CLE_B) ! CLE_C ! CLE_D "

CODE_RECU.Q=(CLE_E ! CLE_B) ! CLE_C ! CLE_D
; 
debug " Comme xor ! est commutatif il n'est pas nécessaire de tester toutes les permutations car nous aurons toujours le même résultat" 
debug " *** On retrouve le code d'origine  en Hex="+HEX(CODE_RECU)+"       Élémentaire mon cher Watson !!!! "
debug "                                                                               Oui bien sûr mais quant est-il avec un code alpha-numérique ????"
debug "Code reçu en Hex="+HEX(CODE_RECU)+" Comparé au code à l'origine en Hex="+HEX(M_A)

debug " Vous pouvez augmenter le nombre de personnes N en générant N-1 clés aléatoires et en procédant comme ci-dessus"
3) Vous désirez passer un texte un message secret ou un code confidentiel à une autre personne sans qu'une tierce personne puisse lire le texte.
Et vous ne pouvez en aucun cas lui passer une clé de décryptage en claire (donc pas de clé publique).
La seule possibilité est de lui transmettre un texte crypté.
La solution n’est pas dans l’utilisation du RSA ou d’un autre algo à clé publique,
et aucune clé ni aucune information autre que le texte crypté ne peuvent être transmises.
Comment faites-vous pour que cette autre personne puisse lire le texte?

Solution
Chez A
A Crypte le code ou le message secret avec sa propre clé CLE_A
M1=Mo  CLE_A
M1 est envoyé à B qui reçoit un message illisible

Chez B
B va crypter M1 avec sa propre clé CLE_B
M2=M1  CLE_B
B envoie M2 à A qui reçoit un message illisible

Chez A
A décrypte M2 avec sa propre clé CLE_A

M3= M2  CLE_A
M3 illisible est envoyé à B

Chez B
B décrypte M3 avec sa propre clé CLE_B
Et B peut lire le code ou le message que lui a envoyé A

En récapitulant
MO  CLE_A =>M1  CLE_B=> M2  CLE_A =>M3  CLE_B =M4=MO
donc
MO  CLE_A  CLE_B  CLE_A  CLE_B

Comme  est commutatif et associatif
On peut déplacer les clés de la façon suivante
MO  CLE_A  CLE_A ==> MO et Mo  CLE_B  CLE_B ==> MO CQFD
Ce qui revient à dire que l’on restitue en B le message d’origine de A


Code : Tout sélectionner

 Macro _q_t_
 "
 EndMacro
 Macro _n (__n)
 _q_t_#__n#=_q_t_+Str(__n)+" "
 EndMacro
;;**************************** CHEZ A *******************************************************
;;Maintenant on à 1 personne nommée A qui désire communiquer un CODE de coffre ou un message secret avec une autre personne nommée B
;;Chez A M_A le Code ou le message est  M_A.Q=$1C02B01A06B
; Il va réaliser  l'opération sans clé publique at sans envoyé son mot de passe 
M_A.Q=$1C02B01A06B ;;; Code du coffre .
debug "**********   Nous sommes chez A  origine de message ***********"
Debug "Code ou message d'origine qui sera crypté et envoyé a B  en hexa="+hex(M_A)
;; On a au chois la possibilité d'imposer un mot de passe ou de tirer au hasard 
; CLE_A.Q=$EDCA98701;;; il n'est pas nécessaire d'imposer une clé
; randomseed($7FFFFFFF) ;;;; pour générer le même nombre aléatoire cette instruction n'est pas nécessaire pour ce problème.
CLE_A.q=random($7FFFFFFF,1)
; A va avec cette  clés  crypter le message à envoyer à B
M_A_E_B.q=M_A.Q ! CLE_A 
; Le travail de A pour cette phase est terminé.
debug "La cle de cryptage de A est en Hex="+hex(CLE_A)
Debug "Code ou message envoyé a B  en hexa="+hex(M_A_E_B)
debug "****************************************************************"


;**********************************  CHEZ B *********************************************************
;; B reçoit le message Crypté de A
;; Comme il ne peut le décrypter il le surcrypte avec soit un mot de passe ou une clé aléatoire CLE_B
CLE_B.Q=random($7FFFFFFF,1)
;;; Il SURCODE M_A_E_B
M_A_E_B_E_A.Q= M_A_E_B ! CLE_B  ;;; signification de la variable M_A Envoyé à B Envoyé à A
debug ""
debug ""
debug "**********    Nous sommes chez B qui reçoit le message de A et le sur crypte puisqu'il n'a pas la clé de A **************"
debug "B reçoit en Hex="+hex(M_A_E_B)
debug "La cle de cryptage de B est en Hex="+hex(CLE_B)
debug "B renvoie à A  en Hex="+hex(M_A_E_B_E_A)
debug "************************************************************************************************************************"


;;**************************** CHEZ A **reçoit M_A_E_B_E_A*****************************************************
;;; Il va décryter avec sa clé CLE_A le message qu'il reçoit de B

M_A_E_B_A_D_E_B.Q= M_A_E_B_E_A ! CLE_A
debug ""
debug ""
debug "**********    Nous sommes chez A qui reçoit le message de B sur crypté il va retirer son cryptage et renvoyé à B puisqu'il n'a pas la clé de B **************"
debug "A reçoit en Hex="+hex(M_A_E_B_E_A )
debug "La cle de cryptage de A est en Hex="+hex(CLE_A)
debug "A renvoie à B  en Hex="+hex(M_A_E_B_A_D_E_B)
debug "************************************************************************************************************************************************************"
;;;; renvoie le message M_A_E_B_A_D_E_B décrypté par lui mais toujours crypté par B


;**********************************  CHEZ B *********************************************************
;;; B reçoit le message M_A_E_B_A_D_E_B décrypte par A il lui suffit de le décrypter pour connaitre le Code ou le message que lui à envoyer A
M_A_D_A_D_B.Q = M_A_E_B_A_D_E_B ! CLE_B
CODE_ORIGINE.q=M_A_D_A_D_B
debug ""
debug ""
debug "**********    Nous sommes chez B qui reçoit le message de A décrypte et il va le décrypter lui même avec sa cle  CLE_B  **************"
debug "B reçoit de A en Hex="+hex(M_A_E_B_A_D_E_B)
debug "La cle de cryptage de B est en Hex="+hex(CLE_B)
debug "M_A d'origine en Hex="+hex(M_A)+" Message reçu par B en Hex="+hex(M_A_E_B_A_D_E_B )+" Message décrypté par B en fin de procedure en Hex="+hex(M_A_D_A_D_B)
Debug "Code ou message  reçu en fin de procédure après cryptage de A cryptage de B décryptage de A et décryptage de B"
debug " Voici le message en Hex="+hex(M_A_D_A_D_B) +"       Élémentaire mon cher Watson !!!! "
debug "                                                     Oui bien sûr mais quant est-il avec un code alpha-numérique ????"
Debug " On voit qu'il n'est pas nécessaire d'avoir une clé publique ni d'avoir le même prg et surtout de ne pas connaitre le mot de passe de l'autre intervenant"
debug " il suffit que les 2 prg de cryptage soient commutatifs et symétriques que le codage et le décodage soient utilisés avec le même algo"
Debug " On peut réaliser un programme Alphanumérique  avec les mêmes caractéristiques  que XOR  ! en numérique."

A+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Quelques problèmes de cryptage à résoudre.

Message par Zorro »

c'est ce que je disais, j'avais donné le principe dans mes reponses

ton probleme 1 c'est du Xor tout simple , avec mot de pass et fichier encrypté ..

ton probleme 2 c'est du Sur-encodage de Xor (ça aurai pu etre n'importe quel codage type Symétrique .... Vigenère par exemple , ou Cesar )
tu aurai tout aussi bien pu donner un morceau de la clef a chacun des membres
il aurai fallu qu'ils soient réuni pour reconstituer le fichier encodé en assemblant leur clef (par addition par exemple ) pour creer la Clef Final

Ton probleme 3 c'est aussi du Sur-encodage , c'est juste l'echange entre protagoniste qui fait la difference ...
cependant en matiere de discretion, on evite aussi les aller-retour des fichiers sensible ...


pour ma part je ne considere pas Xor comme Faible !!
a une seule condition , il faut que la clef de decodage soit aussi longue que le fichier a encoder !!

la faiblesse du XOR viens en partie de
l'epoque ou les magazines d'informatique avaient en leur CD ROm un dossier d'images de Cul encodé XOR ...
il fallait faire 3615 -ou 3617 " je-sais-plus-quoi " pour avoir le code de décryptage de chaqu'une des images ....

le probleme , les gars avaient encodé les images (Jpg) avec un mot de passe court !!
mot de pass qui se repetait tout au long du fichier image ...

la faiblesse venait que le mot de pass etait plus court que l'entete JPG , entete qui est constante et connu comme le loup blanc !
Image

et Xor a cette particularité que si on encode une valeur avec un mot de pass ==> Clair XOR Pass = Codé
l'inverse permet de ressortir le pass ==> Codé XOR Clair = PASS !!

ici le codé c'etait l'octet du fichier , le clair c'etait l'octet connu de l'entete Jpg , ça renvoyais le premier octet du mot de pass .... :)

ainsi , il suffisait de Programmer un decodeur , qui lirai les premier octets du fichier Crypté , puis XOR les premiers octet de l'entet JPEG (toujours les memes
quelques soit les images )
pour avoir le mot de pass .. et comme celui-ci etait court et repeté tout au long de l'image
le decodeur etait un jeux d'enfant a faire :)


mais , si le mot de pass n'avait pas été répété , mais d'une longueur egale au fichier image
le fait de n'avoir décodé que l'entete, n'aurai pas suffit, puisqu'il nous aurai manqué le reste du mot de pass ....
si ce principe est respecté , XOR est tout simplement inviolable ! :)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Quelques problèmes de cryptage à résoudre.

Message par PAPIPP »

Bonjour à tous

Voici la solution du 4em problème.

Code : Tout sélectionner

Structure S_X_cr ; S comme structure X comme dimension inconnue et cr comme crochet []
	StructureUnion
		VA.a[0]   ; ascii
		VB.b[0]   ; byte
		VC.c[0]   ; character
		VS.s{1}[0]; String 1 Byte
		VS2.s{2}[0]; String 2 Bytes
		VS3.s{3}[0]; String 3 Bytes
		VS4.s{4}[0]; String 4 Bytes
		VS8.s{8}[0]; String 8 Bytes
		VS16.s{16}[0]; String 16 Bytes
		VS32.s{32}[0]; String 32 Bytes
		VS64.s{64}[0]; String 64 Bytes
		VS128.s{128}[0]; String 128 Bytes
		VS256.s{256}[0]; String 256 Bytes
		VS512.s{512}[0]; String 512 Bytes
 		VS1024.s{1024}[0]; String 1024 Bytes
 		VS2048.s{2048}[0]; String 2048 Bytes
    Vu.u[0]   ; unicode
		Vw.w[0]   ; word
		Vl.l[0]   ; long
		Vi.i[0]   ; integer
		Vq.q[0]   ; quad
		Vf.f[0]   ; float
		Vd.d[0]   ; double
	EndStructureUnion
EndStructure
Structure BSTR
  Long.l
  chaine.S_X_cr
EndStructure 
Structure SORTIE 
  LONG.l
  POURC.F
EndStructure 
Structure SORTIEC 
  StructureUnion 
    COMPLEX.Q
    STAT.SORTIE
  EndStructureUnion
EndStructure
CompilerIf #PB_Compiler_Unicode
CompilerElse
  MessageRequester("ATTENTION","Vous devez être en Option UNICODE")
  End
 CompilerEndIf
Define Prem.S_X_cr
longueur=?fin_donne-?donne_num
; Debug _n(longueur)
Read.q Prem\Vq[0]
taille=prem\Vl[0]
*Hist4.S_X_cr=AllocateMemory(Taille+12)
*Hist1.S_X_cr=AllocateMemory(Taille+12)
NB_iter=(longueur/8)
it=0
Restore donne_num

Repeat
Read.q *hist4\Vq[it]
it+1
Until it>NB_iter-1
*hist4+4  ;;;; pour être en accord avec la convention BSTR
longc=taille/2
Dim tab.c(longc-1)
For i=0 To longc-1
  tab(i)=i
Next  
RandomSeed(longc) 
RandomizeArray(Tab());;;; Mélange des indices pour mélange et retour à l'ordre normal
 For j=0 To longc-1
    JJ=tab(j)
    *hist1\VC[j]= *hist4\VC[jj] ! jj  ;;;; XOR pour ne pas retrouver les caractères utilisés. Ici pour les retrouver
 Next
  PokeL(*hist1-4,PeekL(*hist4-4))
   ;;;************************************************************************************************
  Debug PeekS(*hist1,longc)
;   DataSection
; donne_num:
; Data.q 9289150972822990,32933006073856034,30399834362544239,12666399729713255,13792793556549678,14918659103457344
; Data.q 23925613546045556,13792776377270388,3659471057191021,2533644163219543,26177503550898261,3659458170847311
; Data.q 23644306066571268,18296264329461840,21673933988233242,8163178057171029,10133270961520733,9570329599279159
; Data.q 16325832128462898,9851869001023544,51791541747253250,34058635393957943,13510987861983270,50384123914485819
; Data.q 1688940057919609,31243765364949058,20547789265174538,2251808405585994,22799580488400923,5629615503769682
; Data.q 4222167601709238,26177567971803145,68117970867388427,67554960789274786,65021686003597478,65302937642926335
; Data.q 68962408690942187,55733097671819488,59673730162688226,65303208223637748,59392130631532767,55169662384799960
; Data.q 56014375077085391,57421805794951371,62769817464013018,41940694957490391,43066324285784218,58829202150588635
; Data.q 49540291699146910,63614066301665456,9289421566836903,56014533993103550,49540356125950122,49540287401296126
; Data.q 59392014666629303,51792134460145832,36029372555788542,41377427176751255,43910130739642499,56014203277607070
; Data.q 44192194124120270,37718557422583940,41377470126555266,40251510089253014,104710254713503952,99080707947823474
; Data.q 106680532314423650,101332116920926528,103584247446176095,104710220369232215,102458502154092899,93169836516442426
; Data.q 94014102531146036,73466390577348975,98236197117821263,94295624754200907,76844128955859275,133701799366558038
; Data.q 86414316816433430,87540195245752659,85569668544135500,83599378067751276,82755189360558371,86977043432669500
; Data.q 83599395248603435,88384766205100326,87540169476604196,76562465000456570,77406993005543735,91480561449632019
; Data.q 79095679654756611,85006555380842767,94858256874864923,79377150340432179,97110155478106389,85851070508433750
; Data.q 99362453504000281,135954123181130221,129480580963697062,120754603287904682,136236031948751354,139613761732411771
; Data.q 141302534284509682,123569421773832687,108369884700410276,128635748014424450,110621645857423750,111747266591457758
; Data.q 134546971629126109,128073111592960448,113999543142908376,132858220556911071,120473098246095344,121599268731486627
; Data.q 119347322892452274,88103463036191161,125821178624737723,142709960703279521,124976775183139257,87540895338660287
; Data.q 126383991147856319,108088061825384898,109776894505451974,129761716636352900,115969438483677646,109777014765715841
; Data.q 111184299454628226,134265608322548104,153406559578161554,177331889658593832,173954271537857062,175361423088419370
; Data.q 176487292922561147,171420902258573949,178739049789391460,175643104223625786,174516714686317170,145525079848387143
; Data.q 173390930744050245,147776965561156106,167198700300141120,150028447544181341,168043215423603287,148902813929636430
; Data.q 159035741293052446,155658045863887458,155376832880443939,157065386387571236,175924300023071396,157628435126878775
; Data.q 156221326531363362,159880226348597813,149746899555385874,147213903935701528,146369242782302739,165791531573051919
; Data.q 148621330362597966,168042863236219414,151998785266385439,170294955105714717,189435773213082137,207168748299682545
; Data.q 215050155020452583,202102250253517567,211672352222348028,195065131026154231,209983618324497145,209420608240419575
; Data.q 202102142884381332,209419912455455431,200413237182137044,200413215711691480,184932203657888398,186057794328134363
; Data.q 200976367525233363,188309847548494486,193376470143992525,193939201050936034,187465139148358376,189717059220406956
; Data.q 197598444471517866,213079555302687484,197035494513836790,195909594607649454,183805947274396327,186339475453117073
; fin_donne:
; EndDataSection

 DataSection
donne_num:
Data.q 30962741359412482,27022104572657708,34903068917301365,29837331087097898,12948055093608574,14918397112090737
Data.q 16044314194280562,29273917276553274,23925677971079246,27303373388841031,21392476192702530,3659578429276239
Data.q 19421842117361757,2815093370585174,20829251361439831,8163087862988826,27303231660163102,28429178809745506
Data.q 10414827544772643,17733224183037990,17733189828411502,13511060877213734,12385405788749887,35184599730159679
Data.q 18296148367638573,3377991781449806,7318658632318981,21674144437698598,1407452193619968,23925441740341270
Data.q 3096310645194777,3096289170227215,48133187386277915,66147323916910760,64458491234156771,71214238569463978
Data.q 68680929415987431,68680929419657394,69806855088832723,66992088149852411,59391769854279922,56577217656717521
Data.q 62769869007356076,70932295435616455,60236559857090702,41940407199072450,62206841744195734,60799445386920090
Data.q 48414404677533904,45036975537783016,39970189733986474,47851759664038051,51792091512373419,68962129515839654
Data.q 48414490579370220,50666243144614141,37718235301937406,39407145288007819,37436760326078667,36873900567232736
Data.q 37155590288048282,43911006910021880,61080735676104866,62206596927193306,104991454813618393,102458407669989731
Data.q 106961762484814197,99643709443277163,107806548192592132,106680553791291767,88103269756633457,104710284789940585
Data.q 95139671723802942,73466347627807052,98236197113364803,93451174056624401,76844150426763593,97110353046012247
Data.q 106680442120765779,98517697864532315,81629001689530747,86695607106863393,84443841652064553,84443863127818532
Data.q 79940534082863393,104991497772269877,106117672556822843,88384414015160623,93169591698719039,90636097865056588
Data.q 73466184414920978,76280938476732757,85569505333412103,76562404864819460,97110013739139330,77688261821989132
Data.q 120191825118626075,121317780869087712,119628952488116723,137361850250822142,140176690208768508,142428524387303803
Data.q 124132625126719968,118784609159414248,139332063413469674,126384257438777806,128917493573484939,134265500948562393
Data.q 112873183677907364,131732329238954455,134828553980543447,132857958564823450,122724958187684225,119910182646120867
Data.q 137643080414134698,135109904408707513,125539716541841839,141020823081320887,120754607582806463,119347215515058607
Data.q 109214215137788347,108088091893498257,108088091890286984,114842941574480267,116532422795198914,79940903461126610
Data.q 113717647260451237,110339947538285018,153406198795534732,171139465940566636,144961983867912780,177894835316064867
Data.q 179864915336430187,163539383872258684,161569076213514866,176206024107819536,166635720284963447,165509803190452816
Data.q 164102136253252102,168605984991150660,166635788997427805,163821026345681474,176768587515691611,169169141098021402
Data.q 159598734198047322,157628327751647779,161006079011652202,161569295253897758,159880149041349163,160161671266107959
Data.q 161006147732177465,156221004412813865,145806327190061694,150028460429214223,144117391428223562,149746942502371936
Data.q 153969028499243588,145243360055853589,149747152965206530,150872812348834313,3238440010251
fin_donne:
EndDataSection

A+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Répondre