import base64
import hashlib
import json
import os
import time
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import padding
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
# この値は例を示すために任意に設定された値です
CP_SECRET_KEY = '0123456789abcdefg'
def encrypt(content: str, secret_key: str) -> str:
key = hashlib.sha256(secret_key.encode('utf-8')).digest() # CP_SECRET_KEYを256ビットのキーに変換します。
iv = os.urandom(16) # 16バイト(128ビット)のIVを使用します。
padder = padding.PKCS7(128).padder() # 128ビットのPKCS7パディングを使用します。
backend = default_backend() # 通常、OpenSSLがバックエンドとして使用されます。
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend) # CBCモードのAESを使用します。
encryptor = cipher.encryptor()
content_padded = padder.update(content.encode('utf-8')) + padder.finalize()
content_enc = encryptor.update(content_padded) + encryptor.finalize()
return base64.b64encode(iv + content_enc).decode('utf-8')
token_info = {
'uid': 'test-user-1',
'fullname': '김토끼',
'email': 'tokki.kim@test.com',
'courseId': 1234,
'ts': int(time.time() * 1000)
}
token = encrypt(json.dumps(token_info), CP_SECRET_KEY)
using System;
using System.Text;
using System.Security.Cryptography;
static String Encrypt(String content, String secretKey)
{
using (SHA256 sha256 = SHA256.Create())
using (Aes aes = Aes.Create())
{
byte[] iv = new byte[16];
rngCsp.GetBytes(iv);
aes.Key = sha256.ComputeHash(Encoding.UTF8.GetBytes(secretKey));
aes.IV = iv;
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
byte[] contentBytes = Encoding.UTF8.GetBytes(content);
byte[] contentEnc = aes.CreateEncryptor()
.TransformFinalBlock(contentBytes, 0, contentBytes.Length);
byte[] result = new byte[iv.Length + contentEnc.Length];
iv.CopyTo(result, 0);
contentEnc.CopyTo(result, iv.Length);
return Convert.ToBase64String(result);
}
}
import java.lang.System;
import java.security.MessageDigest;
import java.util.Base64; // JDK 8+のみ
import java.util.Random;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter; // JDK 6、JDK 7のみ
static String encrypt(String content, String secretKey) throws Exception {
byte[] iv = new byte[16];
new Random().nextBytes(iv);
MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
sha256.update(secretKey.getBytes("UTF-8"));
byte[] key = sha256.digest();
// JavaでのPKCS5Paddingは実際にはPKCS7Paddingとして動作します。
Cipher aes = Cipher.getInstance("AES/CBC/PKCS5Padding");
aes.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"), new IvParameterSpec(iv));
byte[] contentBytes = content.getBytes("UTF-8");
byte[] contentEnc = aes.doFinal(contentBytes, 0, contentBytes.length);
byte[] result = new byte[iv.length + contentEnc.length];
System.arraycopy(iv, 0, result, 0, iv.length);
System.arraycopy(contentEnc, 0, result, iv.length, contentEnc.length);
// JDK 8+のみ
byte[] resultBase64 = Base64.getEncoder().encode(result);
return new String(resultBase64);
// JDK 6, JDK 7
// return DatatypeConverter.printBase64Binary(result);
}
{
"uid": "test-user-1",
"fullname": "김토끼",
"email": "tokki.kim@test.com",
"ts": 1586961104518
}