A requirement of a recent project is that the function of a module can be used only by entering the serial number. enter the serial number, encrypt it, and package it into a file and store it in sdcard. Verify whether such a file exists under sdcard next time.
How to encrypt and decrypt data in Java:
There are two classes:
Keygenerator: This class provides (symmetric) key generator functions.
Cipher: This class provides the password function for encryption and decryption.
During encryption and decryption, cipher uses the key generated by keygenerator to encrypt (generate ciphertext) and decrypt (PARSE ciphertext)
Public class main {public static void main (string [] ARGs) throws nosuchalgorithmexception, unsupportedencodingexception {// ------------------- encryption process ----------------------------- // generates a key, A "des" algorithm keygenerator = keygenerator needs to be associated. getinstance ("des"); secretkey generator ey = keygenerator. generatekey (); // infostring info = "12345678" to be encrypted; // output the ciphertext content before encryption system. out. println ("" + info); // generate a randomsecurerandom sr = new securerandom (); byte [] cipherbyteencrypt = NULL; try {cipher C1 = cipher. getinstance ("des"); c1.init (cipher. encrypt_mode, cipher ey, Sr); // generate the ciphertext cipherbyteencrypt = c1.dofinal (info. getbytes ();} catch (exception e) {e. printstacktrace ();} // output the encrypted ciphertext content system. out. println ("" + new string (cipherbyteencrypt, "ISO-8859-1"); // --------------------- decryption process ------------------------------- // generate a random sr = new securerandom (); byte [] cipherbytedecrypt = NULL; try {cipher C1 = cipher. getinstance ("des"); c1.init (cipher. decrypt_mode, cipher ey, Sr); // parse the ciphertext cipherbytedecrypt = c1.dofinal (cipherbyteencrypt);} catch (exception e) {e. printstacktrace ();} system. out. println ("" + new string (cipherbytedecrypt, "ISO-8859-1 "));}}
Output:
12345678
3 m ± @*:?;??? + J ??? ----------------> This is the ciphertext
12345678
Add one question:
Why is ISO-8859-1 used in code.
See the following code:
Bytebytes [] = new byte [] {50, 0,-1, 28,-24 };
String string = new string (bytes );
Byte [] ret = string. getbytes ();
Check the RET data and find that the data is 50, 0,-17,-65,-67, 28,-17,-65,-67. The data is not the original data.
Use the following code to obtain the original data:
Bytebytes [] = new byte [] {50, 0,-1, 28,-24 };
Stringisostring = new string (bytes, "ISO-8859-1 ");
Byte [] isoret = isostring. getbytes ("ISO-8859-1 ");
Why? The reason is that the first method is to generate a string using UTF-8 encoding by default, with system. getproperty ("Sun. JNU. encoding") You can get Android default encoding is UTF-8. The UTF-8 is a variable length encoding, and the original byte array is changed. While ISO8859-1 is usually called Latin-1, Latin-1 includes additional characters that are indispensable for writing all Western European languages, 0 ~ The character of 127 is the same as the ASCII code. It is a single-byte encoding method, so that the byte array in the string generated in the second method is the same as the original byte array. The use of other encoding in new string, such as GBK, gb2312, will also lead to changes in the byte array, so to get a single byte array in the string, you should use iso8859-1 encoding.