Welcome, guest! Login / Register - Why register?
Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)

Paste

Pasted as Java by registered user samueladigunawan ( 3 years ago )
public static byte[][] GenerateKeyAndIV(int keyLength, int ivLength, int iterations, byte[] salt, byte[] password, MessageDigest md) {

		    int digestLength = md.getDigestLength();
		    int requiredLength = (keyLength + ivLength + digestLength - 1) / digestLength * digestLength;
		    byte[] generatedData = new byte[requiredLength];
		    int generatedLength = 0;

		    try {
		        md.reset();

		        // Repeat process until sufficient data has been generated
		        while (generatedLength < keyLength + ivLength) {

		            // Digest data (last digest if available, password data, salt if available)
		            if (generatedLength > 0)
		                md.update(generatedData, generatedLength - digestLength, digestLength);
		            md.update(password);
		            if (salt != null)
		                md.update(salt, 0, 8);
		            md.digest(generatedData, generatedLength, digestLength);

		            // additional rounds
		            for (int i = 1; i < iterations; i++) {
		                md.update(generatedData, generatedLength, digestLength);
		                md.digest(generatedData, generatedLength, digestLength);
		            }

		            generatedLength += digestLength;
		        }

		        // Copy key and IV into separate byte arrays
		        byte[][] result = new byte[2][];
		        result[0] = Arrays.copyOfRange(generatedData, 0, keyLength);
		        if (ivLength > 0)
		            result[1] = Arrays.copyOfRange(generatedData, keyLength, keyLength + ivLength);

		        return result;

		    } catch (DigestException e) {
		        throw new RuntimeException(e);

		    } finally {
		        // Clean out temporary data
		        Arrays.fill(generatedData, (byte)0);
		    }
		}


		public static String decryptSSO(String key, String value) {
			try {
					byte[] cipherData = Base64.getDecoder().decode(value);
					byte[] saltData = Arrays.copyOfRange(cipherData, 8, 16);

					MessageDigest md5 = MessageDigest.getInstance("MD5");
					final byte[][] keyAndIV = GenerateKeyAndIV(32, 16, 1, saltData, key.getBytes(StandardCharsets.UTF_8), md5);
					SecretKeySpec keys = new SecretKeySpec(keyAndIV[0], "AES");
					IvParameterSpec iv = new IvParameterSpec(keyAndIV[1]);

					byte[] encrypted = Arrays.copyOfRange(cipherData, 16, cipherData.length);
					Cipher aesCBC = Cipher.getInstance("AES/CBC/PKCS5Padding");
					aesCBC.init(Cipher.DECRYPT_MODE, keys, iv);
					byte[] decryptedData = aesCBC.doFinal(encrypted);
					String decryptedText = new String(decryptedData, StandardCharsets.UTF_8);

					return decryptedText;
				} catch (Exception e) {
					System.out.println(e.toString());
					return null;
			}
		}

 

Revise this Paste

Your Name: Code Language: