/* * Copyright 2016 Huawei Technologies Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.openo.baseservice.encrypt.cbb.impl; import java.security.NoSuchAlgorithmException; import java.security.spec.InvalidKeySpecException; import java.security.spec.KeySpec; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.SecretKeySpec; import javax.xml.bind.DatatypeConverter; import org.openo.baseservice.encrypt.cbb.inf.AbstractCipher; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * CipherManager implement
*

*

* * @author * @version 31-May-2016 */ public class AesCipher implements AbstractCipher { private static final Logger LOG = LoggerFactory.getLogger(AesCipher.class); private static final byte[] DEFAULT_IV = {2, 1, 4, 8, 0, 3, 2, 0, 7, 9, 2, 8, 5, 11, 6, 1}; private static final IvParameterSpec IV_PARAMETER_SPEC = new IvParameterSpec(DEFAULT_IV); protected final SecretKey secretKey; /** * Constructor
*

* Creates default key. *

* * @since */ public AesCipher() { super(); secretKey = createSecretKey("default"); } /** * * Constructor
*

*

* Creates key. * @param key * @since */ public AesCipher(final String key) { super(); secretKey = createSecretKey(key); } private SecretKey createSecretKey(final String key) { SecretKey secretKey = null; try { final SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); final KeySpec keySpec = new PBEKeySpec(key.toCharArray(), DEFAULT_IV, 30000, 128); secretKey = keyFactory.generateSecret(keySpec); return new SecretKeySpec(secretKey.getEncoded(), "AES"); } catch(InvalidKeySpecException e) { LOG.error("Invalid KeySpec ", e); } catch(NoSuchAlgorithmException e) { LOG.error("Algorithm do not support: ", e); } return null; } @Override public String encrypt(final String plain) { try { final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, secretKey, IV_PARAMETER_SPEC); final byte[] encryptToBytes = cipher.doFinal(plain.getBytes()); return DatatypeConverter.printBase64Binary(encryptToBytes); } catch(final Exception e) { LOG.error("Encrypt the plain error:", e); return null; } } @Override public String decrypt(final String encrypted) { if(encrypted == null || encrypted.length() == 0) { return null; } if(secretKey == null) { return null; } try { final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, secretKey, IV_PARAMETER_SPEC); final byte[] tempBytes = DatatypeConverter.parseBase64Binary(encrypted); final byte[] decrypTobytes = cipher.doFinal(tempBytes); return new String(decrypTobytes); } catch(final Exception e) { LOG.error("decrypt the plain error:", e); return null; } } }