Y's note

Web技術・プロダクトマネジメント・そして経営について

本ブログの更新を停止しており、今後は下記Noteに記載していきます。
https://note.com/yutakikuchi/

crypto++でのお手軽暗号

お手軽暗号


@yutakikuchi_
cpp/PHPPythoncryptcppECBCBCIVcppLibrarycrypto++
Crypto++ Library 5.6.2 - a Free C++ Class Library of Cryptographic Schemes はてなブックマーク - Crypto++ Library 5.6.2 - a Free C++ Class Library of Cryptographic Schemes

crypto++

install

以下のOneLineです。

$ sudo yum install cryptopp cryptopp-devel -y
DES × ECB

TripleDES - Crypto++ Wiki はてなブックマーク - TripleDES - Crypto++ Wiki DES × ECB/crypto++wikiTripleDES × CBCkeySoul GemECBIV => 16 => 16 => 
#include <iostream>
#include "modes.h"
#include "filters.h"
#include "hex.h"
#include "des.h"

using namespace std;
using namespace CryptoPP;

int main(int argc, char* argv[]) {

	string plain = "魔法少女まどか☆マギカ";
	string cipher, encoded, decoded, recovered;
	ECB_Mode<DES>::Encryption encctx;
        byte key[DES::DEFAULT_KEYLENGTH];
	memcpy( key, "Soul Gem", DES::DEFAULT_KEYLENGTH );
	encctx.SetKey( key, DES::DEFAULT_KEYLENGTH );

	// ciper
	StringSource( plain, true, 
        new StreamTransformationFilter( encctx,
            new StringSink( cipher )
			//StreamTransformationFilter::PKCS_PADDING
                       //StreamTransformationFilter::ZEROS_PADDING
        )      
        ); 
	//cout << "cipher text: " << cipher << endl;	

	// hex encode
	StringSource( cipher, true,
    	new HexEncoder( 
        	new StringSink( encoded )
    	)
	);
	cout << "encode text: " << encoded << endl;	
	
        // hex decode
	StringSource( encoded, true,
    	new HexDecoder( 
        	new StringSink( decoded )
    	)
	);
	// cout << "decode text: " <<  decoded << endl;	

	// ciper decode
	ECB_Mode<DES>::Decryption decctx;
	decctx.SetKey( key, DES::DEFAULT_KEYLENGTH );
	StringSource( decoded, true, 
        new StreamTransformationFilter( decctx,
            new StringSink( recovered )
			//StreamTransformationFilter::PKCS_PADDING
			//StreamTransformationFilter::ZEROS_PADDING
        )
        );
	cout << "recovered text: " << recovered << endl;
	return 0;
}
$ g++ -I/usr/include/cryptopp -lcryptopp crypto.cpp
$ ./a.out                                  
encode text: B374EB12891FFF5C538281C88A612D522F2CE61360BA5B6776EB2A32E77E5C66B42978BA11B1C5E3
recovered text: 魔法少女まどか☆マギカ
Support Padding

Crypto++: StreamTransformationFilter Class Reference はてなブックマーク - Crypto++: StreamTransformationFilter Class Reference
enum  BlockPaddingScheme { 
  NO_PADDING, 
  ZEROS_PADDING, 
  PKCS_PADDING, 
  ONE_AND_ZEROS_PADDING, 
  DEFAULT_PADDING 
}

crypto++PaddingPadding/PHPPHPmcryptZEROS_PADDING(NULL_PADDING)keyPaddingPHPencryptcrypto++encode text
<?php

function pkcs5_pad ($text, $blocksize) 
{ 
    $pad = $blocksize - (strlen($text) % $blocksize); 
    return $text . str_repeat(chr($pad), $pad); 
}

function pkcs5_unpad($text) 
{ 
    $pad = ord($text{strlen($text)-1}); 
    if ($pad > strlen($text)) return false; 
    if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false; 
    return substr($text, 0, -1 * $pad); 
}  

//$size = mcrypt_get_block_size(MCRYPT_DES, MCRYPT_MODE_ECB);
$message = '魔法少女まどか☆マギカ';
//$message = pkcs5_pad( $message, $size );
$key = 'Soul Gem';

$encryptedMessage = mcrypt_encrypt(MCRYPT_DES, $key, $message, MCRYPT_MODE_ECB);
$decryptedMessage = mcrypt_decrypt(MCRYPT_DES, $key, $encryptedMessage, MCRYPT_MODE_ECB);

echo "encode text:" . strtoupper(bin2hex($encryptedMessage)) . "\n";
echo "recovered text:$decryptedMessage";
// phpでmcryptを使う為の設定
$ wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ wget http://ftp.riken.jp/Linux/fedora/epel/RPM-GPG-KEY-EPEL-6
$ sudo rpm --import RPM-GPG-KEY-EPEL-6
$ sudo rpm -i epel-release-6-8.noarch.rpm
$ sudo yum install php-mcrypt -y

// 上で書いたプログラムを実行
$ php crypto.php 
encode text:B374EB12891FFF5C538281C88A612D522F2CE61360BA5B6776EB2A32E77E5C6656FAC9AFC18DA65F
recovered text:魔法少女まどか☆マギカ

crypto++PHPcrypto++ZERO_PADDINGPHPPKCS5PaddingPKCS5PKCS5PaddingPHPmcrypt_get_block_sizepkcs5_padpkcs5_padURLPHP: Mcrypt Functions - Manual はてなブックマーク - PHP: Mcrypt Functions - Manual crypto++StreamTransformationFilter::PKCS_PADDING,StreamTransformationFilter::ZEROS_PADDINGZEROS_PADDINGencode textcrypto++PHP
$ cp crypto.cpp crypto2.cpp
$ vi crypto.cpp // StreamTransformationFilter::ZEROS_PADDINGをコメントイン
$ diff -u crypto.cpp crypto2.cpp 
--- crypto.cpp	2013-11-15 03:00:46.778536984 +0900
+++ crypto2.cpp	2013-11-15 03:00:02.604531919 +0900
@@ -19,8 +19,9 @@
 	// ciper
 	StringSource( plain, true, 
         new StreamTransformationFilter( encctx,
-            new StringSink( cipher ),
-            StreamTransformationFilter::ZEROS_PADDING
+            new StringSink( cipher )
+			//StreamTransformationFilter::PKCS_PADDING
+      //StreamTransformationFilter::ZEROS_PADDING
         )      
     ); 
 	cout << "cipher text: " << cipher << endl;	
@@ -46,8 +47,9 @@
 	decctx.SetKey( key, DES::DEFAULT_KEYLENGTH );
 	StringSource( decoded, true, 
         new StreamTransformationFilter( decctx,
-            new StringSink( recovered ),
-			      StreamTransformationFilter::ZEROS_PADDING
+            new StringSink( recovered )
+			//StreamTransformationFilter::PKCS_PADDING
+			//StreamTransformationFilter::ZEROS_PADDING
         )
     );
 	cout << "recovered text: " << recovered << endl;

$ g++ -I/usr/include/cryptopp -lcryptopp crypto.cpp
$ ./a.out
encode text: B374EB12891FFF5C538281C88A612D522F2CE61360BA5B6776EB2A32E77E5C6656FAC9AFC18DA65F
recovered text: 魔法少女まどか☆マギカ