2010-07-09 4 views
1

J'ai deux nombres: un est un int, l'autre est un octet. Je veux en créer une longue valeur unique de telle sorte que la personne connaissant la valeur de l'octet puisse y déchiffrer l'int. Quel est le meilleur moyen de le faire?Combiner int et octet en long

+0

Êtes-vous vouloir juste pour stocker les deux valeurs dans une longue, ou essayez-vous de cacher la valeur int afin que seulement la personne qui connaît la valeur d'octet peut l'obtenir? – DaveJohnston

+0

seulement la personne qui connaît la valeur d'octet peut l'obtenir - c'est correct – axl

+1

alors je serais d'accord avec la réponse de st0le.Bien que n'étant pas un mécanisme de cryptage très sécurisé, il répond à tout le moins aux exigences que vous avez définies. – DaveJohnston

Répondre

1
long mylong = (((long)mybyte) << 40) | myint; 

Pour récupérer la valeur d'origine:

int myorigint = (int)(mylong & ~(((long)mybyte) << 40)); 

Mais cela nécessite 8 positions longues octets. Qui ne sont pas requis par la norme C. Si un long est de 4 octets, vous n'avez pas de chance. Cela signifie long et int aurait la même longueur. Si sizeof(int)==sizeof(long)==4, puis demandant de stocker un int et un octet dans un long demande de stocker 5 octets arbitraires d'informations dans 4 octets. Ce qui est complètement impossible.

Bien sûr, il y a aussi trivial "solution":

long mylong = (long)myint; 

et l'inverse est:

int myint = (int)mylong; 

Maintenant, quelqu'un sachant (ou ne sachant pas!) L'octet peut récupérer l'original Les données.

Si vous voulez une solution telle que seulement quelqu'un connaissant l'octet correct peut récupérer l'int d'origine, vous pouvez utiliser ceci:

long mylong = (long)(myint-mybyte); 

et inverse:

int myint = (int)(mylong+mybyte); 

Mais sachez que chiffrer quatre octets avec un octet ne sera pas vraiment sécurisé. Vous devez utiliser un pavé unique de 4 octets pour chiffrer quatre octets. Si vous avez une clé de quatre octets, utilisez XOR pour un chiffrement vraiment incassable. Pas vraiment.

+0

"Si vous avez une clé de quatre octets, utilisez XOR pour un chiffrement vraiment incassable." C'est vrai! – ZoFreX

+0

En effet, je crois que vous faites référence au cryptage "one-time-pad". Qui est en effet incassable si l'octet utilisé pour crypter est vraiment randon ET seulement utilisé une fois. Je me demande ce que l'OP essaie d'accomplir! –

2

En supposant que je compris votre question correcte,

La solution la plus simple, vous pouvez le XOR 'int' en utilisant le 'octet'

Répétez le processus pour décrypter ...

  byte key = 8; 
     int secret = 123; 
     System.out.println("Secret : " + secret); 
     int encrypted = (secret^(key | (key << 8))); 
     System.out.println("Encrypted : " + encrypted); 
     int decrypt = (encrypted^(key | (key << 8))); 
     System.out.println("Decrypted : " + decrypt); 

Le résultat est un 'int' mais, vous pouvez toujours le transformer en un long ...

+0

Je voudrais simplement ajouter que le fait de lancer le résultat à long est pratiquement inutile, car il ajoutera simplement des zéros supplémentaires à la valeur chiffrée. Si vous voulez vraiment utiliser des longs, vous pouvez convertir la clé à un octet et le secret de 4 octets en valeurs de 8 octets avant de commencer le processus. Bien que cela n'améliore pas vraiment la sécurité du chiffrement, vous utiliserez au moins les 64 bits au lieu d'avoir seulement 32 zéros ajoutés au début. – DaveJohnston

+2

Notez que cela a quelques problèmes en tant que chiffrement. Tout d'abord, vous avez seulement "protégé" les deux derniers octets de quatre. Deuxièmement, en supposant que vous (comme la plupart des gens la plupart du temps) n'utilisez pas vraiment de grands nombres, l'int que vous cryptez commencera probablement avec des zéros. Ce qui signifie qu'un "attaquant" pourrait simplement prendre l'un des premiers octets de votre numéro, et ce sera la clé (XORing quelque chose avec tous les zéros produit la chose originale, non modifiée). Si vous voulez un cryptage, utilisez un cryptage réel - ne vous tracassez pas avec la sécurité. – Borealid

1

Une idée consiste à appliquer une fonction réversible le nombre de fois indiqué par l'octet.

Pour retrouver le numéro d'origine, appliquez la même fonction inverse le même nombre de fois.

par exemple.

public static int encrypt(int value, byte key) { 
    int result=value; 
    for (int i=0; i<=(key&255); i++) { 
    result=Integer.rotateRight(result,7)^(i+0xCAFEBABE); 
    } 
    return result; 
} 

Trouver la fonction inverse à gauche comme un exercice pour le lecteur .....

Questions connexes