Programming/node.js2016. 12. 20. 14:28


Node.js 

const crypto = require("crypto");
const algo = 'aes-128-cbc';
const key = "security_key";
const iv = "iv_key";
const value = 'HelloWorld';
const keyBuffer = new Buffer(crypto.createHash('md5').update(key).digest('hex'),"hex");
const ivBuffer = new Buffer(crypto.createHash('md5').update(iv).digest('hex'),"hex");
const textBuffer = new Buffer(value);

let cipher = crypto.createCipheriv(algo, keyBuffer,ivBuffer); let encrypted = cipher.update(textBuffer); let encryptedFinal = cipher.final(); let encryptedText = encrypted.toString('base64') + encryptedFinal.toString('base64'); console.log(encryptedText); //xr046x2iGy4IDUHUm+p7lA==

let decipher = crypto.createDecipheriv(algo, keyBuffer,ivBuffer); decipher.setAutoPadding(true);//padding 처리가 언어별 달라서 확인필요 let decipheredContent = decipher.update(encryptedText,'base64','utf8'); decipheredContent += decipher.final('utf8'); console.log(decipheredContent); //HelloWorld


C# (Unity3D)

출처 : http://wyseburn.tistory.com/entry/AES-CBC-128BIT-PKCS5-%EC%95%94%EB%B3%B5%ED%98%B8%ED%99%94-1

using UnityEngine; using System; using System.Text; using System.IO; using System.Security.Cryptography; using System.Runtime.Remoting.Metadata.W3cXsd2001; public class Crypto { public static readonly string key = MD5Hash("security_key"); public static readonly string iv = MD5Hash("iv_key"); public static string MD5Hash(string str) { MD5 md5 = new MD5CryptoServiceProvider(); byte[] hash = md5.ComputeHash(Encoding.ASCII.GetBytes(str)); StringBuilder stringBuilder = new StringBuilder(); foreach (byte b in hash) { stringBuilder.AppendFormat("{0:x2}", b); } return stringBuilder.ToString(); } private static byte[] GetBytesFromHexString(string strInput) { byte[] bytArOutput = new byte[] { }; if ((!string.IsNullOrEmpty(strInput)) && strInput.Length % 2 == 0) { SoapHexBinary hexBinary = null; hexBinary = SoapHexBinary.Parse(strInput); bytArOutput = hexBinary.Value; } return bytArOutput; } //AES 암호화 public static string AES128Encrypt(string Input) { try { RijndaelManaged aes = new RijndaelManaged(); //aes.KeySize = 256; //AES256으로 사용시 aes.KeySize = 128; //AES128로 사용시 aes.BlockSize = 128; aes.Mode = CipherMode.CBC; aes.Padding = PaddingMode.PKCS7; aes.Key = GetBytesFromHexString(key); aes.IV = GetBytesFromHexString(iv); var encrypt = aes.CreateEncryptor(aes.Key, aes.IV); byte[] xBuff = null; using (var ms = new MemoryStream()) { using (var cs = new CryptoStream(ms, encrypt, CryptoStreamMode.Write)) { byte[] xXml = Encoding.UTF8.GetBytes(Input); cs.Write(xXml, 0, xXml.Length); } xBuff = ms.ToArray(); } string Output = Convert.ToBase64String(xBuff); return Output; } catch (Exception ex) { Debug.LogError(ex.Message); return ex.Message; } } //AES 복호화 public static string AES128Decrypt(string Input) { try { RijndaelManaged aes = new RijndaelManaged(); //aes.KeySize = 256; //AES256으로 사용시 aes.KeySize = 128; //AES128로 사용시 aes.BlockSize = 128; aes.Mode = CipherMode.CBC; aes.Padding = PaddingMode.PKCS7; aes.Key = GetBytesFromHexString(key); aes.IV = GetBytesFromHexString(iv); var decrypt = aes.CreateDecryptor(); byte[] xBuff = null; using (var ms = new MemoryStream()) { using (var cs = new CryptoStream(ms, decrypt, CryptoStreamMode.Write)) { byte[] xXml = Convert.FromBase64String(Input); cs.Write(xXml, 0, xXml.Length); } xBuff = ms.ToArray(); } string Output = Encoding.UTF8.GetString(xBuff); return Output; } catch (Exception ex) { Debug.LogError(ex.Message); return string.Empty; } } }


Posted by 시니^^
Programming/Etc2014. 4. 11. 18:58

1. 알고리즘 특징과 설명(PHP기준)

DES 

전통적인 DES 알고리즘으로 키의 길이가 작아 비교적 보안에 취약하다. 상수 MCRYPT_DES를 사용한다. 

3DES/Triple DES 

DES의 변형 판이다. 유효 키 길이는 112비트이다. 상수 MCRYPT_3DES를 사용한다. 

CAST-128 

캐나다에서 설계된 알고리즘으로 128비트 키와 64비트 블럭을 가진다. 상수 MCRYPT_CAST_128을 사용한다. 

CAST-256 

CAST-128의 확장 판으로 알고리즘으로 256비트 키와 128비트 블럭을 가진다. 상수 MCRYPT_CAST_256을 사용한다. 

XTEA 

128비트 키와 64비트 브럭을 가진다. 상수 MCRYPT_XTEA를 사용한다. 

3-WAY 

96비트 키와 블럭을 가진다. 상수 MCRYPT_THREEWAY를 사용한다. 

SKIPJACK 

미국 NSA에서 조건부 암호화 표준으로 설계한 알고리즘이지만 표준화되지 못했다. mcryp에서 추가 라이브러리를 이용해 접근할 수 있으며 80비트 키를 가진다. 상수 MCRYPT_SKIPJACK를 사용한다. 

BLOWFISH 

DES를 개선한 알고리즘으로 최대 448비트 길이의 키를 사용할 수 있다. 상수 MCRYPT_BLOWFISH를 사용한다. 

TWOFISH 

보안성이 높고 융통성이 있다. 128, 192, 256비트 키를 지원한다. 상수 MCRYPT_TWOFISH를 사용한다. 

LOKI97 

128, 192, 256비트 길이의 키를 이용한다. 상수 MCRYPT_LOKI97를 사용한다. 

RC2 

블럭 크기를 64비트이며 키는 8에서 1024비트이다. 오래된 알고리즘으로 16비트 컴퓨터에 적당하다. 상수 MCRYPT_RC2를 사용한다. 

ARCFOUR/RC4 

RC4는 RSADSL의 상표이므로 mcrypt는 RC4 알고리즘을 지원하지 않지만 ARCFOUR와 호환된다. 스트림 기반의 암호문과 최대 2048 비트 키를 지원한다. 상수 MCRYPT_ARCFOUR를 사용한다. 

RIJNDAEL 

가변적인 길의 블럭 암호문과 키를 가진다. 상수 MCRYPT_RIJNDAEL_128, MCRYPT_RIJNDAEL_192, MCRYPT_RIJNDAEL_256을 사용한다. 

SERPENT 

128비트 블럭 암호문으로 DES보다 빠르다. 상수 MCRYPT_SERPENT를 사용한다. 

IDEA 

64비트 블럭과 128비트 키를 사용한다. 상수 MCRYPT_IDEA를 사용한다. 

ENIGMA/CRYPT 

하나의 원통을 가진 암호화 기계를 기반으로 해서 보안성이 낮다. 상수 MCRYPT_CRYPT를 사용한다. 

GOST 

256비트 키와 64비트 블럭을 가진다. 상수 MCRYPT_GOST를 사용한다. 

SAFER 

64비트, 128비트 키를 지원하는 빠르고 안전한 알고리즘이다. 상수 MCRYPT_SAFER64, MCRYPT_SAFER128을 사용한다. 

SAFER+ 

SAFER 알고리즘의 확장판으로 128, 196, 256비트 키를 지원한다. 상수 MCRYPT_SAFERPLUS를 사용한다


2. PHP 모듈정보

MCRYPT_3DES

MCRYPT_ARCFOUR_IV (libmcrypt > 2.4.x only)

MCRYPT_ARCFOUR (libmcrypt > 2.4.x only)

MCRYPT_BLOWFISH

MCRYPT_CAST_128

MCRYPT_CAST_256

MCRYPT_CRYPT

MCRYPT_DES

MCRYPT_DES_COMPAT (libmcrypt 2.2.x only)

MCRYPT_ENIGMA (libmcrypt > 2.4.x only, alias for MCRYPT_CRYPT)

MCRYPT_GOST

MCRYPT_IDEA (non-free)

MCRYPT_LOKI97 (libmcrypt > 2.4.x only)

MCRYPT_MARS (libmcrypt > 2.4.x only, non-free)

MCRYPT_PANAMA (libmcrypt > 2.4.x only)

MCRYPT_RIJNDAEL_128 (libmcrypt > 2.4.x only)

MCRYPT_RIJNDAEL_192 (libmcrypt > 2.4.x only)

MCRYPT_RIJNDAEL_256 (libmcrypt > 2.4.x only)

MCRYPT_RC2

MCRYPT_RC4 (libmcrypt 2.2.x only)

MCRYPT_RC6 (libmcrypt > 2.4.x only)

MCRYPT_RC6_128 (libmcrypt 2.2.x only)

MCRYPT_RC6_192 (libmcrypt 2.2.x only)

MCRYPT_RC6_256 (libmcrypt 2.2.x only)

MCRYPT_SAFER64

MCRYPT_SAFER128

MCRYPT_SAFERPLUS (libmcrypt > 2.4.x only)

MCRYPT_SERPENT (libmcrypt > 2.4.x only)

MCRYPT_SERPENT_128 (libmcrypt 2.2.x only)

MCRYPT_SERPENT_192 (libmcrypt 2.2.x only)

MCRYPT_SERPENT_256 (libmcrypt 2.2.x only)

MCRYPT_SKIPJACK (libmcrypt > 2.4.x only)

MCRYPT_TEAN (libmcrypt 2.2.x only)

MCRYPT_THREEWAY

MCRYPT_TRIPLEDES (libmcrypt > 2.4.x only)

MCRYPT_TWOFISH (for older mcrypt 2.x versions, or mcrypt > 2.4.x )

MCRYPT_TWOFISH128 (TWOFISHxxx are available in newer 2.x versions, but not in the 2.4.x versions)

MCRYPT_TWOFISH192

MCRYPT_TWOFISH256

MCRYPT_WAKE (libmcrypt > 2.4.x only)

MCRYPT_XTEA (libmcrypt > 2.4.x only) 


3. 성능(자바기준)

출처 : http://www.javamex.com/tutorials/cryptography/ciphers.shtml

자세한 내용은 위에 링크~!!( 영어다 ㅠㅠ )



Posted by 시니^^