Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9703

Java/JavaScript/C#で暗号化する

$
0
0

各言語で暗号化。
やってみると、暗号化後の文字列が各言語で違ってしまったりして、意外とハマったりします。
ここでは、Java/JavaScript/C#を取り上げてみます。

暗号化

Java

まずは、Java。

Crypto.java
importjava.nio.charset.StandardCharsets;importjavax.crypto.Cipher;importjavax.crypto.spec.IvParameterSpec;importjavax.crypto.spec.SecretKeySpec;importjava.util.Base64;publicfinalclassCrypto{privatestaticfinalStringKEY="1234567890abcdef";privatestaticfinalStringIV="abcdef1234567890";privateCrypto(){}privatestaticCiphercreateCipher(intmode)throwsException{Ciphercipher=Cipher.getInstance("AES/CBC/PKCS5Padding");SecretKeySpeckey=newSecretKeySpec(KEY.getBytes(StandardCharsets.UTF_8),"AES");IvParameterSpeciv=newIvParameterSpec(IV.getBytes(StandardCharsets.UTF_8));cipher.init(mode,key,iv);returncipher;}publicstaticStringencrypt(Stringtext){try{Ciphercipher=createCipher(Cipher.ENCRYPT_MODE);Base64.Encoderencoder=Base64.getEncoder();returnencoder.encodeToString(cipher.doFinal(text.getBytes(StandardCharsets.UTF_8)));}catch(Exceptione){thrownewRuntimeException(e);}}publicstaticStringdecrypt(Stringtext){try{Ciphercipher=createCipher(Cipher.DECRYPT_MODE);Base64.Decoderdecoder=Base64.getDecoder();returnnewString(cipher.doFinal(decoder.decode(text)));}catch(Exceptione){thrownewRuntimeException(e);}}}

JavaScript

次にJavaScript。実行環境はNode.jsです。

Crypto.js
constcrypto=require('crypto')constKEY='1234567890abcdef'constIV='abcdef1234567890'functioncreateCipher(mode){returncrypto[mode]('aes-128-cbc',KEY,IV)}functionencrypt(text){constcipher=createCipher('createCipheriv')constencrypted=cipher.update(text);returnBuffer.concat([encrypted,cipher.final()]).toString('base64')}functiondecrypt(text){constbuf=Buffer.from(text,'base64')constcipher=createCipher('createDecipheriv')constdecrypted=cipher.update(buf);returnBuffer.concat([decrypted,cipher.final()]).toString('utf-8')}

C#

最後にC#。

Crypto.cs
usingSystem;usingSystem.Security.Cryptography;usingSystem.Text;publicsealedclassCrypto{privateconststringKEY="1234567890abcdef";privateconststringIV="abcdef1234567890";privateCrypto(){}privatestaticAesManagedCreateAesManaged(){AesManagedaes=newAesManaged();aes.KeySize=256;aes.BlockSize=128;aes.Mode=CipherMode.CBC;aes.IV=Encoding.UTF8.GetBytes(IV);aes.Key=Encoding.UTF8.GetBytes(KEY);aes.Padding=PaddingMode.PKCS7;returnaes;}publicstaticstringEncrypt(stringtext){AesManagedaes=CreateAesManaged();byte[]byteText=Encoding.UTF8.GetBytes(text);byte[]encryptText=aes.CreateEncryptor().TransformFinalBlock(byteText,0,byteText.Length);returnConvert.ToBase64String(encryptText);}publicstaticstringDecrypt(stringtext){AesManagedaes=CreateAesManaged();byte[]src=System.Convert.FromBase64String(text);byte[]dest=aes.CreateDecryptor().TransformFinalBlock(src,0,src.Length);returnEncoding.UTF8.GetString(dest);}}

結果

暗号化(encrypt)すると、以下の結果になります。

  • ""(空文字)=> 0e8Yyuobp55/giEyC01lbg==
  • alz1590-'$ => cMgaJ1X/cVENp+rnMo/8Kw==
  • あむんアムンアムン亜無漚錡𠀋𪚲 => jXw9bzISBZsndhcrJx/gJU7ltBzSp34xn6CL3xBbNE2yC0FhQBisP27WOXan/W2o

復号(decrypt)すると、元の文字列が得られます。

補足

  • IVは初期化ベクトルです。同じデータであっても違う暗号文にするための文字列です。
  • KEY/IVは長さに決まりがあるので注意。

Viewing all articles
Browse latest Browse all 9703

Trending Articles