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
Répondre
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.
"Si vous avez une clé de quatre octets, utilisez XOR pour un chiffrement vraiment incassable." C'est vrai! – ZoFreX
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! –
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 ...
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
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
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 .....
- 1. traitement: convertir int en octet
- 2. Différence entre long et int en C#?
- 3. Plage de int et long
- 4. long long vs multiplication int
- 5. Octet de string/int en C++
- 6. Python: containg tuples et Lits long int
- 7. long int dans ObjC
- 8. 'long long int' est interprété comme 'long int'. Comment puis-je contourner cela?
- 9. Java - int/long, float/double
- 10. Java arithmétique int contre long
- 11. avertissement pour int à long
- 12. NHibernate identity: int ou long
- 13. Conversion octet à int, float, NSString
- 14. convertir 'int' en 'long' ou accéder à un tableau trop long avec 'long'
- 15. Long long int sur les machines 32 bits
- 16. Diviser Int en int et retourner int
- 17. Comment n'est pas représenté int/long représenté
- 18. Comment imprimer un int long signé avec printf en C?
- 19. Quelle est la différence entre unsigned long/long/int en c/C++?
- 20. Comment convertir un tableau long non signé en octet en C++?
- 21. Convertir octet Chaîne à Int dans le schéma
- 22. Comment extraire un nombre/octet d'un tableau en C?
- 23. Comment convertir un nombre en octet?
- 24. Problème DLL Delphi/C++ - unsigned long vs unsigned int?
- 25. convertir un octet en binaire
- 26. Quelle est la différence entre "int" et "uint"/"long" et "ulong"?
- 27. Comment conserver int long pendant la conversion de chaîne PHP?
- 28. C - Convertir long int à chaîne hexagonale signé
- 29. Combiner une colonne varchar avec une colonne int
- 30. Faire en sorte unsigned int/long exécuter toujours dans un contexte contrôlé en C#
Ê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
seulement la personne qui connaît la valeur d'octet peut l'obtenir - c'est correct – axl
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