AES 대칭키 암복호화
package egovframework.kr.co.fw.util;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public abstract class SimpleCrypto
{
private final static String TRANSFORMATION = "AES";
private final static String HEX = "0123456789ABCDEF";
private SimpleCrypto( )
{}
public static String encrypt( String seed , String cleartext ) throws Exception
{
byte[] rawKey = getRawKey( seed.getBytes( ) );
byte[] result = encrypt( rawKey , cleartext.getBytes( ) );
return toHex( result );
}
public static String decrypt( String seed , String encrypted ) throws Exception
{
byte[] rawKey = getRawKey( seed.getBytes( ) );
byte[] enc = toByte( encrypted );
byte[] result = decrypt( rawKey , enc );
return new String( result );
}
private static byte[] getRawKey( byte[] seed ) throws Exception
{
KeyGenerator kgen = KeyGenerator.getInstance( TRANSFORMATION );
SecureRandom sr = SecureRandom.getInstance( "SHA1PRNG" );
sr.setSeed( seed );
kgen.init( 128 , sr ); // 192 and 256 bits may not be available
SecretKey skey = kgen.generateKey( );
byte[] raw = skey.getEncoded( );
return raw;
}
private static byte[] encrypt( byte[] raw , byte[] clear ) throws Exception
{
SecretKeySpec skeySpec = new SecretKeySpec( raw , TRANSFORMATION );
Cipher cipher = Cipher.getInstance( TRANSFORMATION );
cipher.init( Cipher.ENCRYPT_MODE , skeySpec );
byte[] encrypted = cipher.doFinal( clear );
return encrypted;
}
private static byte[] decrypt( byte[] raw , byte[] encrypted ) throws Exception
{
SecretKeySpec skeySpec = new SecretKeySpec( raw , TRANSFORMATION );
Cipher cipher = Cipher.getInstance( TRANSFORMATION );
cipher.init( Cipher.DECRYPT_MODE , skeySpec );
byte[] decrypted = cipher.doFinal( encrypted );
return decrypted;
}
public static String toHex( String txt )
{
return toHex( txt.getBytes( ) );
}
public static String fromHex( String hex )
{
return new String( toByte( hex ) );
}
public static byte[] toByte( String hexString )
{
int len = hexString.length( ) / 2;
byte[] result = new byte[len];
for ( int i = 0 ; i < len ; i++ )
{
result[ i ] = Integer.valueOf( hexString.substring( 2 * i , 2 * i + 2 ) , 16 ).byteValue( );
}
return result;
}
public static String toHex( byte[] buf )
{
if ( buf == null )
{
return "";
}
StringBuffer result = new StringBuffer( 2 * buf.length );
for ( int i = 0 ; i < buf.length ; i++ )
{
appendHex( result , buf[ i ] );
}
return result.toString( );
}
private static void appendHex( StringBuffer sb , byte b )
{
sb.append( HEX.charAt( ( b >> 4 ) & 0x0f ) ).append( HEX.charAt( b & 0x0f ) );
}
public static void main( String[] args ) throws Exception
{
String masterpassword = "1111111";
String cleartext = "a1한글sfsfsdfsd423423423가나다라마ㅏ아말ㄴㅇ란ㅇ란아란아ㅏㅈㄷ갖다ㅏㄹㄴ알낭란아란아라낭ㅁ나ㅏ313123213213123423423423432123123ㄹㄴ아란아란ㅇ라ㅏ아말ㄴㅇ란ㅇ란아란아ㅏㅈㄷ갖다ㅏㄹㄴ알낭란아란아라낭ㅁ나ㅏ313123213213123423423423432123123ㄹㄴ아란아란ㅇ라낭라";
System.out.println( cleartext.length( ) );
String crypto = SimpleCrypto.encrypt( masterpassword , cleartext );
System.out.println( crypto );
String decryptcleartext = SimpleCrypto.decrypt( masterpassword , crypto );
System.out.println( decryptcleartext );
}
}
'JAVA' 카테고리의 다른 글
[JAVA] class path에서 resource 찾기 (0) | 2017.10.30 |
---|---|
[JAVA] cache function (0) | 2017.10.27 |
[JAVA] BigInteger형을 바이트 배열로!! (0) | 2017.10.27 |
[JAVA] application att (0) | 2017.10.27 |
[JAVA] 1000분의 1초까지 나타내기 (0) | 2017.10.20 |