

<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>AES &#8211; Max的程式語言筆記</title>
	<atom:link href="https://stackoverflow.max-everyday.com/tag/aes/feed/" rel="self" type="application/rss+xml" />
	<link>https://stackoverflow.max-everyday.com</link>
	<description>我要當一個豬頭，快樂過每一天</description>
	<lastBuildDate>Sat, 28 Jan 2017 17:24:42 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://stackoverflow.max-everyday.com/wp-content/uploads/2017/02/max-stackoverflow-256.png</url>
	<title>AES &#8211; Max的程式語言筆記</title>
	<link>https://stackoverflow.max-everyday.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Encrypt and Decrypt by AES algorithm in both python and android</title>
		<link>https://stackoverflow.max-everyday.com/2016/12/encrypt-and-decrypt-by-aes-algorithm-in-both-python-and-android/</link>
					<comments>https://stackoverflow.max-everyday.com/2016/12/encrypt-and-decrypt-by-aes-algorithm-in-both-python-and-android/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Sat, 17 Dec 2016 17:00:11 +0000</pubDate>
				<category><![CDATA[Android筆記]]></category>
		<category><![CDATA[Python筆記]]></category>
		<category><![CDATA[AES]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[password]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">http://stackoverflow.max-everyday.com/?p=73</guid>

					<description><![CDATA[我想在 python 把敏感的資料先加密，傳給A...]]></description>
										<content:encoded><![CDATA[<p>我想在 python 把敏感的資料先加密，傳給Android 後在Android裡解密，在stackoverflow 上面找到這一個範例，滿神奇的，程式碼貼進 python 和 android 就可以跑了，而且可以互相加／解密沒問題。</p>
<p>stackoverflow：<br />
<a href="http://stackoverflow.com/questions/29013414/encrypt-and-decrypt-by-aes-algorithm-in-both-python-and-android">http://stackoverflow.com/questions/29013414/encrypt-and-decrypt-by-aes-algorithm-in-both-python-and-android</a></p>
<hr />
<p>我的執行畫面：</p>
<p><a href="http://max-everyday.com/wp-content/uploads/2016/12/Screenshot-2016-12-18-15.31.06.jpg"><img fetchpriority="high" decoding="async" class="alignnone size-full wp-image-2061" src="http://max-everyday.com/wp-content/uploads/2016/12/Screenshot-2016-12-18-15.31.06.jpg" alt="" width="1198" height="414" /></a></p>
<p>上面 terminal 是 python 的執行結果，下面白色是Android Studio 執行結果，使用同一把的key，python 產生出來的base64 碼是：</p>
<blockquote><p>hPbYdXXJ472jW2VsEOZLa5iBosENVulYO1xDPI23SsjvebY341uFOS5ZV</p></blockquote>
<p>Android 產生的base64碼是：</p>
<blockquote><p>oBOM8SX0a2YcLK2oltF1J/x+WqMP6sDj4Cbp0fPDlroepybDE1CuVsidjyIqNaeq</p></blockquote>
<p>雖然2邊加密完成後的所產生的base64碼長的不一樣，但是把 Android 產生出來的base64碼放到python裡去解，可以解出一樣的資料出來。</p>
<p>再更進階一點點的做法是加入Spongy Castle或Bouncy Castle：<br />
<a href="http://stackoverflow.com/questions/6898801/how-to-include-the-spongy-castle-jar-in-android">http://stackoverflow.com/questions/6898801/how-to-include-the-spongy-castle-jar-in-android</a></p>
<p>* Unfortunately, Android SDK doesn`t support PBKDF2WithHmacSHA256, so we use Spongy Castle, which is the stock Bouncy Castle libraries with a couple of small changes to make it work on Android.<br />
* For version 1.47 or higher of SpongyCastle, we can invoke PBKDF2WithHmacSHA256 directly,<br />
* but for versions below 1.47, we could not specify SHA256 digest and it defaulted to SHA1.<br />
* see<br />
* 1. <a href="https://rtyley.github.io/spongycastle/">https://rtyley.github.io/spongycastle/</a><br />
* 2. <a href="http://stackoverflow.com/a/15303291/3962551">http://stackoverflow.com/a/15303291/3962551</a><br />
* 3. <a href="https://en.wikipedia.org/wiki/Bouncy_Castle_(cryptography)">https://en.wikipedia.org/wiki/Bouncy_Castle_(cryptography)</a></p>
<h4>Bouncy Castle</h4>
<p>充氣城堡軍團（Legion of the Bouncy Castle）是一個來自澳大利亞的慈善團體，他們編寫了Bouncy Castle這個廣泛使用的類庫。該庫既提供了一個輕量級的密碼學 API，也是一個 Java 密碼擴展（JCE）的提供者。安卓平台已經內置了一個精簡過的老版本 Bouncy Castle（同時為了適配安卓平台也做了一些細小的改動）。</p>
<h4>Spongy Castle</h4>
<p>Spongy Castle 背後的動機是允許安卓開發者在應用程式中使用任意版本的 BouncyCastle 類庫。SpongyCastle 就是對最新版本的 BouncyCastle 進行了簡單地重新打包。</p>
<hr />
<p>Python code :</p>
<pre class="lang-py prettyprint prettyprinted"><code><span class="kwd">import</span><span class="pln"> base64
</span><span class="kwd">import</span><span class="pln"> hashlib
</span><span class="kwd">from</span> <span class="typ">Crypto</span> <span class="kwd">import</span> <span class="typ">Random</span>
<span class="kwd">from</span> <span class="typ">Crypto</span><span class="pun">.</span><span class="typ">Cipher</span> <span class="kwd">import</span><span class="pln"> AES

</span><span class="kwd">class</span> <span class="typ">AESCipher</span><span class="pun">:</span>
    <span class="kwd">def</span><span class="pln"> __init__</span><span class="pun">(</span><span class="pln">self</span><span class="pun">,</span><span class="pln"> key</span><span class="pun">):</span><span class="pln">
        self</span><span class="pun">.</span><span class="pln">bs </span><span class="pun">=</span> <span class="lit">16</span><span class="pln">
        self</span><span class="pun">.</span><span class="pln">key </span><span class="pun">=</span><span class="pln"> hashlib</span><span class="pun">.</span><span class="pln">sha256</span><span class="pun">(</span><span class="pln">key</span><span class="pun">.</span><span class="pln">encode</span><span class="pun">()).</span><span class="pln">digest</span><span class="pun">()</span>

    <span class="kwd">def</span><span class="pln"> encrypt</span><span class="pun">(</span><span class="pln">self</span><span class="pun">,</span><span class="pln"> message</span><span class="pun">):</span><span class="pln">
        message </span><span class="pun">=</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">_pad</span><span class="pun">(</span><span class="pln">message</span><span class="pun">)</span><span class="pln">
        iv </span><span class="pun">=</span> <span class="typ">Random</span><span class="pun">.</span><span class="pln">new</span><span class="pun">().</span><span class="pln">read</span><span class="pun">(</span><span class="pln">AES</span><span class="pun">.</span><span class="pln">block_size</span><span class="pun">)</span><span class="pln">
        cipher </span><span class="pun">=</span><span class="pln"> AES</span><span class="pun">.</span><span class="pln">new</span><span class="pun">(</span><span class="pln">self</span><span class="pun">.</span><span class="pln">key</span><span class="pun">,</span><span class="pln"> AES</span><span class="pun">.</span><span class="pln">MODE_CBC</span><span class="pun">,</span><span class="pln"> iv</span><span class="pun">)</span>
        <span class="kwd">return</span><span class="pln"> base64</span><span class="pun">.</span><span class="pln">b64encode</span><span class="pun">(</span><span class="pln">iv </span><span class="pun">+</span><span class="pln"> cipher</span><span class="pun">.</span><span class="pln">encrypt</span><span class="pun">(</span><span class="pln">message</span><span class="pun">)).</span><span class="pln">decode</span><span class="pun">(</span><span class="str">'utf-8'</span><span class="pun">)</span>

    <span class="kwd">def</span><span class="pln"> decrypt</span><span class="pun">(</span><span class="pln">self</span><span class="pun">,</span><span class="pln"> enc</span><span class="pun">):</span><span class="pln">
        enc </span><span class="pun">=</span><span class="pln"> base64</span><span class="pun">.</span><span class="pln">b64decode</span><span class="pun">(</span><span class="pln">enc</span><span class="pun">)</span><span class="pln">
        iv </span><span class="pun">=</span><span class="pln"> enc</span><span class="pun">[:</span><span class="pln">AES</span><span class="pun">.</span><span class="pln">block_size</span><span class="pun">]</span><span class="pln">
        cipher </span><span class="pun">=</span><span class="pln"> AES</span><span class="pun">.</span><span class="pln">new</span><span class="pun">(</span><span class="pln">self</span><span class="pun">.</span><span class="pln">key</span><span class="pun">,</span><span class="pln"> AES</span><span class="pun">.</span><span class="pln">MODE_CBC</span><span class="pun">,</span><span class="pln"> iv</span><span class="pun">)</span>
        <span class="kwd">return</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">_unpad</span><span class="pun">(</span><span class="pln">cipher</span><span class="pun">.</span><span class="pln">decrypt</span><span class="pun">(</span><span class="pln">enc</span><span class="pun">[</span><span class="pln">AES</span><span class="pun">.</span><span class="pln">block_size</span><span class="pun">:])).</span><span class="pln">decode</span><span class="pun">(</span><span class="str">'utf-8'</span><span class="pun">)</span>

    <span class="kwd">def</span><span class="pln"> _pad</span><span class="pun">(</span><span class="pln">self</span><span class="pun">,</span><span class="pln"> s</span><span class="pun">):</span>
        <span class="kwd">return</span><span class="pln"> s </span><span class="pun">+</span> <span class="pun">(</span><span class="pln">self</span><span class="pun">.</span><span class="pln">bs </span><span class="pun">-</span><span class="pln"> len</span><span class="pun">(</span><span class="pln">s</span><span class="pun">)</span> <span class="pun">%</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">bs</span><span class="pun">)</span> <span class="pun">*</span><span class="pln"> chr</span><span class="pun">(</span><span class="pln">self</span><span class="pun">.</span><span class="pln">bs </span><span class="pun">-</span><span class="pln"> len</span><span class="pun">(</span><span class="pln">s</span><span class="pun">)</span> <span class="pun">%</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">bs</span><span class="pun">)</span>

    <span class="lit">@staticmethod</span>
    <span class="kwd">def</span><span class="pln"> _unpad</span><span class="pun">(</span><span class="pln">s</span><span class="pun">):</span>
        <span class="kwd">return</span><span class="pln"> s</span><span class="pun">[:-</span><span class="pln">ord</span><span class="pun">(</span><span class="pln">s</span><span class="pun">[</span><span class="pln">len</span><span class="pun">(</span><span class="pln">s</span><span class="pun">)-</span><span class="lit">1</span><span class="pun">:])]</span></code></pre>
<hr />
<p>Android Code:</p>
<pre class="lang-java prettyprint prettyprinted"><code><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">io</span><span class="pun">.</span><span class="typ">IOException</span><span class="pun">;</span>
<span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">security</span><span class="pun">.</span><span class="typ">InvalidAlgorithmParameterException</span><span class="pun">;</span>
<span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">security</span><span class="pun">.</span><span class="typ">InvalidKeyException</span><span class="pun">;</span>
<span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">security</span><span class="pun">.</span><span class="typ">MessageDigest</span><span class="pun">;</span>
<span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">security</span><span class="pun">.</span><span class="typ">NoSuchAlgorithmException</span><span class="pun">;</span>

<span class="kwd">import</span><span class="pln"> javax</span><span class="pun">.</span><span class="pln">crypto</span><span class="pun">.</span><span class="typ">BadPaddingException</span><span class="pun">;</span>
<span class="kwd">import</span><span class="pln"> javax</span><span class="pun">.</span><span class="pln">crypto</span><span class="pun">.</span><span class="typ">Cipher</span><span class="pun">;</span>
<span class="kwd">import</span><span class="pln"> javax</span><span class="pun">.</span><span class="pln">crypto</span><span class="pun">.</span><span class="typ">IllegalBlockSizeException</span><span class="pun">;</span>
<span class="kwd">import</span><span class="pln"> javax</span><span class="pun">.</span><span class="pln">crypto</span><span class="pun">.</span><span class="typ">NoSuchPaddingException</span><span class="pun">;</span>
<span class="kwd">import</span><span class="pln"> javax</span><span class="pun">.</span><span class="pln">crypto</span><span class="pun">.</span><span class="typ">SecretKey</span><span class="pun">;</span>
<span class="kwd">import</span><span class="pln"> javax</span><span class="pun">.</span><span class="pln">crypto</span><span class="pun">.</span><span class="typ">SecretKeyFactory</span><span class="pun">;</span>
<span class="kwd">import</span><span class="pln"> javax</span><span class="pun">.</span><span class="pln">crypto</span><span class="pun">.</span><span class="pln">spec</span><span class="pun">.</span><span class="typ">IvParameterSpec</span><span class="pun">;</span>
<span class="kwd">import</span><span class="pln"> javax</span><span class="pun">.</span><span class="pln">crypto</span><span class="pun">.</span><span class="pln">spec</span><span class="pun">.</span><span class="typ">PBEKeySpec</span><span class="pun">;</span>
<span class="kwd">import</span><span class="pln"> javax</span><span class="pun">.</span><span class="pln">crypto</span><span class="pun">.</span><span class="pln">spec</span><span class="pun">.</span><span class="typ">SecretKeySpec</span><span class="pun">;</span>

<span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">security</span><span class="pun">.</span><span class="typ">SecureRandom</span><span class="pun">;</span>
<span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">security</span><span class="pun">.</span><span class="pln">spec</span><span class="pun">.</span><span class="typ">AlgorithmParameterSpec</span><span class="pun">;</span>
<span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">security</span><span class="pun">.</span><span class="pln">spec</span><span class="pun">.</span><span class="typ">InvalidKeySpecException</span><span class="pun">;</span>
<span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">security</span><span class="pun">.</span><span class="pln">spec</span><span class="pun">.</span><span class="typ">KeySpec</span><span class="pun">;</span>
<span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">Arrays</span><span class="pun">;</span>

<span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">annotation</span><span class="pun">.</span><span class="typ">SuppressLint</span><span class="pun">;</span>
<span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">location</span><span class="pun">.</span><span class="typ">Criteria</span><span class="pun">;</span>
<span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">Base64</span><span class="pun">;</span>
<span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">Log</span><span class="pun">;</span>

<span class="lit">@SuppressLint</span><span class="pun">(</span><span class="str">"NewApi"</span><span class="pun">)</span>
<span class="kwd">public</span> <span class="kwd">class</span> <span class="typ">Crypt</span> <span class="pun">{</span>

<span class="kwd">private</span> <span class="kwd">static</span> <span class="kwd">final</span> <span class="typ">String</span><span class="pln"> tag </span><span class="pun">=</span> <span class="typ">Crypt</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">.</span><span class="pln">getSimpleName</span><span class="pun">();</span>

<span class="kwd">private</span> <span class="kwd">static</span> <span class="kwd">final</span> <span class="typ">String</span><span class="pln"> characterEncoding </span><span class="pun">=</span> <span class="str">"UTF-8"</span><span class="pun">;</span>
<span class="kwd">private</span> <span class="kwd">static</span> <span class="kwd">final</span> <span class="typ">String</span><span class="pln"> cipherTransformation </span><span class="pun">=</span> <span class="str">"AES/CBC/PKCS5Padding"</span><span class="pun">;</span>
<span class="kwd">private</span> <span class="kwd">static</span> <span class="kwd">final</span> <span class="typ">String</span><span class="pln"> aesEncryptionAlgorithm </span><span class="pun">=</span> <span class="str">"AES"</span><span class="pun">;</span>
<span class="kwd">private</span> <span class="kwd">static</span> <span class="kwd">final</span> <span class="typ">String</span><span class="pln"> key </span><span class="pun">=</span> <span class="str">"this is my key"</span><span class="pun">;</span>
<span class="kwd">private</span> <span class="kwd">static</span> <span class="kwd">byte</span><span class="pun">[]</span><span class="pln"> ivBytes </span><span class="pun">=</span> <span class="pun">{</span> <span class="lit">0x00</span><span class="pun">,</span> <span class="lit">0x00</span><span class="pun">,</span> <span class="lit">0x00</span><span class="pun">,</span> <span class="lit">0x00</span><span class="pun">,</span> <span class="lit">0x00</span><span class="pun">,</span> <span class="lit">0x00</span><span class="pun">,</span> <span class="lit">0x00</span><span class="pun">,</span> <span class="lit">0x00</span><span class="pun">,</span> <span class="lit">0x00</span><span class="pun">,</span> <span class="lit">0x00</span><span class="pun">,</span> <span class="lit">0x00</span><span class="pun">,</span> <span class="lit">0x00</span><span class="pun">,</span> <span class="lit">0x00</span><span class="pun">,</span> <span class="lit">0x00</span><span class="pun">,</span> <span class="lit">0x00</span><span class="pun">,</span> <span class="lit">0x00</span> <span class="pun">};</span>
<span class="kwd">private</span> <span class="kwd">static</span> <span class="kwd">byte</span><span class="pun">[]</span><span class="pln"> keyBytes</span><span class="pun">;</span>

<span class="kwd">private</span> <span class="kwd">static</span> <span class="typ">Crypt</span><span class="pln"> instance </span><span class="pun">=</span> <span class="kwd">null</span><span class="pun">;</span>

<span class="typ">Crypt</span><span class="pun">()</span>
<span class="pun">{</span>
    <span class="typ">SecureRandom</span><span class="pln"> random </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">SecureRandom</span><span class="pun">();</span>
    <span class="typ">Crypt</span><span class="pun">.</span><span class="pln">ivBytes </span><span class="pun">=</span> <span class="kwd">new</span> <span class="kwd">byte</span><span class="pun">[</span><span class="lit">16</span><span class="pun">];</span><span class="pln">
    random</span><span class="pun">.</span><span class="pln">nextBytes</span><span class="pun">(</span><span class="typ">Crypt</span><span class="pun">.</span><span class="pln">ivBytes</span><span class="pun">);</span> 
<span class="pun">}</span>

<span class="kwd">public</span> <span class="kwd">static</span> <span class="typ">Crypt</span><span class="pln"> getInstance</span><span class="pun">()</span> <span class="pun">{</span>
    <span class="kwd">if</span><span class="pun">(</span><span class="pln">instance </span><span class="pun">==</span> <span class="kwd">null</span><span class="pun">){</span><span class="pln">
        instance </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">Crypt</span><span class="pun">();</span>
    <span class="pun">}</span>
    <span class="kwd">return</span><span class="pln"> instance</span><span class="pun">;</span>
<span class="pun">}</span>

<span class="kwd">public</span> <span class="typ">String</span><span class="pln"> encrypt_string</span><span class="pun">(</span><span class="kwd">final</span> <span class="typ">String</span><span class="pln"> plain</span><span class="pun">)</span> <span class="kwd">throws</span> <span class="typ">InvalidKeyException</span><span class="pun">,</span> <span class="typ">NoSuchAlgorithmException</span><span class="pun">,</span> <span class="typ">NoSuchPaddingException</span><span class="pun">,</span> <span class="typ">InvalidAlgorithmParameterException</span><span class="pun">,</span> <span class="typ">IllegalBlockSizeException</span><span class="pun">,</span> <span class="typ">BadPaddingException</span><span class="pun">,</span> <span class="typ">IOException</span>
<span class="pun">{</span>
    <span class="kwd">return</span> <span class="typ">Base64</span><span class="pun">.</span><span class="pln">encodeToString</span><span class="pun">(</span><span class="pln">encrypt</span><span class="pun">(</span><span class="pln">plain</span><span class="pun">.</span><span class="pln">getBytes</span><span class="pun">()),</span> <span class="typ">Base64</span><span class="pun">.</span><span class="pln">DEFAULT</span><span class="pun">);</span>
<span class="pun">}</span>

<span class="kwd">public</span> <span class="typ">String</span><span class="pln"> decrypt_string</span><span class="pun">(</span><span class="kwd">final</span> <span class="typ">String</span><span class="pln"> plain</span><span class="pun">)</span> <span class="kwd">throws</span> <span class="typ">InvalidKeyException</span><span class="pun">,</span> <span class="typ">NoSuchAlgorithmException</span><span class="pun">,</span> <span class="typ">NoSuchPaddingException</span><span class="pun">,</span> <span class="typ">InvalidAlgorithmParameterException</span><span class="pun">,</span> <span class="typ">IllegalBlockSizeException</span><span class="pun">,</span> <span class="typ">BadPaddingException</span><span class="pun">,</span> <span class="typ">ClassNotFoundException</span><span class="pun">,</span> <span class="typ">IOException</span>
<span class="pun">{</span>
    <span class="kwd">byte</span><span class="pun">[]</span><span class="pln"> encryptedBytes </span><span class="pun">=</span><span class="pln"> decrypt</span><span class="pun">(</span><span class="typ">Base64</span><span class="pun">.</span><span class="pln">decode</span><span class="pun">(</span><span class="pln">plain</span><span class="pun">,</span> <span class="lit">0</span><span class="pun">));</span>
    <span class="kwd">return</span> <span class="typ">Base64</span><span class="pun">.</span><span class="pln">encodeToString</span><span class="pun">(</span><span class="pln"> encryptedBytes</span><span class="pun">,</span> <span class="typ">Base64</span><span class="pun">.</span><span class="pln">DEFAULT</span><span class="pun">);</span>
<span class="pun">}</span>

<span class="kwd">public</span>   <span class="kwd">byte</span><span class="pun">[]</span><span class="pln"> encrypt</span><span class="pun">(</span>   <span class="kwd">byte</span><span class="pun">[]</span><span class="pln"> mes</span><span class="pun">)</span>
        <span class="kwd">throws</span> <span class="typ">NoSuchAlgorithmException</span><span class="pun">,</span>
        <span class="typ">NoSuchPaddingException</span><span class="pun">,</span>
        <span class="typ">InvalidKeyException</span><span class="pun">,</span>
        <span class="typ">InvalidAlgorithmParameterException</span><span class="pun">,</span>
        <span class="typ">IllegalBlockSizeException</span><span class="pun">,</span>
        <span class="typ">BadPaddingException</span><span class="pun">,</span> <span class="typ">IOException</span> <span class="pun">{</span><span class="pln">

    keyBytes </span><span class="pun">=</span><span class="pln"> key</span><span class="pun">.</span><span class="pln">getBytes</span><span class="pun">(</span><span class="str">"UTF-8"</span><span class="pun">);</span>
    <span class="typ">Log</span><span class="pun">.</span><span class="pln">d</span><span class="pun">(</span><span class="pln">tag</span><span class="pun">,</span><span class="str">"Long KEY: "</span><span class="pun">+</span><span class="pln">keyBytes</span><span class="pun">.</span><span class="pln">length</span><span class="pun">);</span>
    <span class="typ">MessageDigest</span><span class="pln"> md </span><span class="pun">=</span> <span class="typ">MessageDigest</span><span class="pun">.</span><span class="pln">getInstance</span><span class="pun">(</span><span class="str">"SHA-256"</span><span class="pun">);</span><span class="pln">
    md</span><span class="pun">.</span><span class="pln">update</span><span class="pun">(</span><span class="pln">keyBytes</span><span class="pun">);</span><span class="pln">
    keyBytes </span><span class="pun">=</span><span class="pln"> md</span><span class="pun">.</span><span class="pln">digest</span><span class="pun">();</span>

    <span class="typ">Log</span><span class="pun">.</span><span class="pln">d</span><span class="pun">(</span><span class="pln">tag</span><span class="pun">,</span><span class="str">"Long KEY: "</span><span class="pun">+</span><span class="pln">keyBytes</span><span class="pun">.</span><span class="pln">length</span><span class="pun">);</span>

    <span class="typ">AlgorithmParameterSpec</span><span class="pln"> ivSpec </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">IvParameterSpec</span><span class="pun">(</span><span class="pln">ivBytes</span><span class="pun">);</span>
    <span class="typ">SecretKeySpec</span><span class="pln"> newKey </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">SecretKeySpec</span><span class="pun">(</span><span class="pln">keyBytes</span><span class="pun">,</span><span class="pln"> aesEncryptionAlgorithm</span><span class="pun">);</span>
    <span class="typ">Cipher</span><span class="pln"> cipher </span><span class="pun">=</span> <span class="kwd">null</span><span class="pun">;</span><span class="pln">
    cipher </span><span class="pun">=</span> <span class="typ">Cipher</span><span class="pun">.</span><span class="pln">getInstance</span><span class="pun">(</span><span class="pln">cipherTransformation</span><span class="pun">);</span>

    <span class="typ">SecureRandom</span><span class="pln"> random </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">SecureRandom</span><span class="pun">();</span>   
    <span class="typ">Crypt</span><span class="pun">.</span><span class="pln">ivBytes </span><span class="pun">=</span> <span class="kwd">new</span> <span class="kwd">byte</span><span class="pun">[</span><span class="lit">16</span><span class="pun">];</span><span class="pln">               
    random</span><span class="pun">.</span><span class="pln">nextBytes</span><span class="pun">(</span><span class="typ">Crypt</span><span class="pun">.</span><span class="pln">ivBytes</span><span class="pun">);</span><span class="pln">            

    cipher</span><span class="pun">.</span><span class="pln">init</span><span class="pun">(</span><span class="typ">Cipher</span><span class="pun">.</span><span class="pln">ENCRYPT_MODE</span><span class="pun">,</span><span class="pln"> newKey</span><span class="pun">,</span><span class="pln"> random</span><span class="pun">);</span>
<span class="com">//    cipher.init(Cipher.ENCRYPT_MODE, newKey, ivSpec);</span>
    <span class="kwd">byte</span><span class="pun">[]</span><span class="pln"> destination </span><span class="pun">=</span> <span class="kwd">new</span> <span class="kwd">byte</span><span class="pun">[</span><span class="pln">ivBytes</span><span class="pun">.</span><span class="pln">length </span><span class="pun">+</span><span class="pln"> mes</span><span class="pun">.</span><span class="pln">length</span><span class="pun">];</span>
    <span class="typ">System</span><span class="pun">.</span><span class="pln">arraycopy</span><span class="pun">(</span><span class="pln">ivBytes</span><span class="pun">,</span> <span class="lit">0</span><span class="pun">,</span><span class="pln"> destination</span><span class="pun">,</span> <span class="lit">0</span><span class="pun">,</span><span class="pln"> ivBytes</span><span class="pun">.</span><span class="pln">length</span><span class="pun">);</span>
    <span class="typ">System</span><span class="pun">.</span><span class="pln">arraycopy</span><span class="pun">(</span><span class="pln">mes</span><span class="pun">,</span> <span class="lit">0</span><span class="pun">,</span><span class="pln"> destination</span><span class="pun">,</span><span class="pln"> ivBytes</span><span class="pun">.</span><span class="pln">length</span><span class="pun">,</span><span class="pln"> mes</span><span class="pun">.</span><span class="pln">length</span><span class="pun">);</span>
    <span class="kwd">return</span><span class="pln">  cipher</span><span class="pun">.</span><span class="pln">doFinal</span><span class="pun">(</span><span class="pln">destination</span><span class="pun">);</span>
<span class="pun">}</span>

<span class="kwd">public</span>   <span class="kwd">byte</span><span class="pun">[]</span><span class="pln"> decrypt</span><span class="pun">(</span>   <span class="kwd">byte</span><span class="pun">[]</span><span class="pln"> bytes</span><span class="pun">)</span>
        <span class="kwd">throws</span> <span class="typ">NoSuchAlgorithmException</span><span class="pun">,</span>
        <span class="typ">NoSuchPaddingException</span><span class="pun">,</span>
        <span class="typ">InvalidKeyException</span><span class="pun">,</span>
        <span class="typ">InvalidAlgorithmParameterException</span><span class="pun">,</span>
        <span class="typ">IllegalBlockSizeException</span><span class="pun">,</span>
        <span class="typ">BadPaddingException</span><span class="pun">,</span> <span class="typ">IOException</span><span class="pun">,</span> <span class="typ">ClassNotFoundException</span> <span class="pun">{</span><span class="pln">
    keyBytes </span><span class="pun">=</span><span class="pln"> key</span><span class="pun">.</span><span class="pln">getBytes</span><span class="pun">(</span><span class="str">"UTF-8"</span><span class="pun">);</span>
    <span class="typ">Log</span><span class="pun">.</span><span class="pln">d</span><span class="pun">(</span><span class="pln">tag</span><span class="pun">,</span><span class="str">"Long KEY: "</span><span class="pun">+</span><span class="pln">keyBytes</span><span class="pun">.</span><span class="pln">length</span><span class="pun">);</span>
    <span class="typ">MessageDigest</span><span class="pln"> md </span><span class="pun">=</span> <span class="typ">MessageDigest</span><span class="pun">.</span><span class="pln">getInstance</span><span class="pun">(</span><span class="str">"SHA-256"</span><span class="pun">);</span><span class="pln">
    md</span><span class="pun">.</span><span class="pln">update</span><span class="pun">(</span><span class="pln">keyBytes</span><span class="pun">);</span><span class="pln">
    keyBytes </span><span class="pun">=</span><span class="pln"> md</span><span class="pun">.</span><span class="pln">digest</span><span class="pun">();</span>
    <span class="typ">Log</span><span class="pun">.</span><span class="pln">d</span><span class="pun">(</span><span class="pln">tag</span><span class="pun">,</span><span class="str">"Long KEY: "</span><span class="pun">+</span><span class="pln">keyBytes</span><span class="pun">.</span><span class="pln">length</span><span class="pun">);</span>
    <span class="kwd">byte</span><span class="pun">[]</span><span class="pln"> ivB </span><span class="pun">=</span> <span class="typ">Arrays</span><span class="pun">.</span><span class="pln">copyOfRange</span><span class="pun">(</span><span class="pln">bytes</span><span class="pun">,</span><span class="lit">0</span><span class="pun">,</span><span class="lit">16</span><span class="pun">);</span>
    <span class="typ">Log</span><span class="pun">.</span><span class="pln">d</span><span class="pun">(</span><span class="pln">tag</span><span class="pun">,</span> <span class="str">"IV: "</span><span class="pun">+</span><span class="kwd">new</span> <span class="typ">String</span><span class="pun">(</span><span class="pln">ivB</span><span class="pun">));</span>
    <span class="kwd">byte</span><span class="pun">[]</span><span class="pln"> codB </span><span class="pun">=</span> <span class="typ">Arrays</span><span class="pun">.</span><span class="pln">copyOfRange</span><span class="pun">(</span><span class="pln">bytes</span><span class="pun">,</span><span class="lit">16</span><span class="pun">,</span><span class="pln">bytes</span><span class="pun">.</span><span class="pln">length</span><span class="pun">);</span>
    <span class="typ">AlgorithmParameterSpec</span><span class="pln"> ivSpec </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">IvParameterSpec</span><span class="pun">(</span><span class="pln">ivB</span><span class="pun">);</span>
    <span class="typ">SecretKeySpec</span><span class="pln"> newKey </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">SecretKeySpec</span><span class="pun">(</span><span class="pln">keyBytes</span><span class="pun">,</span><span class="pln"> aesEncryptionAlgorithm</span><span class="pun">);</span>
    <span class="typ">Cipher</span><span class="pln"> cipher </span><span class="pun">=</span> <span class="typ">Cipher</span><span class="pun">.</span><span class="pln">getInstance</span><span class="pun">(</span><span class="pln">cipherTransformation</span><span class="pun">);</span><span class="pln">
    cipher</span><span class="pun">.</span><span class="pln">init</span><span class="pun">(</span><span class="typ">Cipher</span><span class="pun">.</span><span class="pln">DECRYPT_MODE</span><span class="pun">,</span><span class="pln"> newKey</span><span class="pun">,</span><span class="pln"> ivSpec</span><span class="pun">);</span>
    <span class="kwd">byte</span><span class="pun">[]</span><span class="pln"> res </span><span class="pun">=</span><span class="pln"> cipher</span><span class="pun">.</span><span class="pln">doFinal</span><span class="pun">(</span><span class="pln">codB</span><span class="pun">);</span> 
    <span class="kwd">return</span><span class="pln">  res</span><span class="pun">;</span>
<span class="pun">}</span>
<span class="pun">}</span></code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2016/12/encrypt-and-decrypt-by-aes-algorithm-in-both-python-and-android/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
