<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
<title type="text">Chris Ballinger</title>
<generator uri="https://github.com/mojombo/jekyll">Jekyll</generator>
<link rel="self" type="application/atom+xml" href="https://ballinger.io/feed.xml" />
<link rel="alternate" type="text/html" href="https://ballinger.io" />
<updated>2018-02-02T00:16:08-08:00</updated>
<id>https://ballinger.io/</id>
<author>
  <name>Chris Ballinger</name>
  <uri>https://ballinger.io/</uri>
  <email>chris@chatsecure.org</email>
</author>


<entry>
  <title type="html"><![CDATA[iBurn 2014 now available for iOS and Android!]]></title>
  <link>https://ballinger.io/blog/iburn-2014-now-available/</link>
  <id>https://ballinger.io/blog/iburn-2014-now-available</id>
  <updated>2014-8-19T00:00:00-00:00</updated>
  <published>2014-08-19T00:00:00-07:00</published>
  
  <author>
    <name>Chris Ballinger</name>
    <uri>https://ballinger.io</uri>
    <email>chris@chatsecure.org</email>
  </author>
  <content type="html">&lt;p&gt;&lt;img src=&quot;http://www.iburnapp.com/img/ipad.png&quot; alt=&quot;iBurn on iPad&quot; /&gt;&lt;/p&gt;

&lt;p&gt;iBurn is an offline map and guide for the &lt;a href=&quot;http://www.burningman.com&quot;&gt;Burning Man&lt;/a&gt; art festival. For the 2014 release we &lt;a href=&quot;https://github.com/Burning-Man-Earth/iBurn-iOS&quot;&gt;rewrote it from scratch&lt;/a&gt; for iOS 7 on top of some really awesome open source software. We decided to use &lt;a href=&quot;https://github.com/yaptv/YapDatabase&quot;&gt;YapDatabase&lt;/a&gt;+&lt;a href=&quot;https://github.com/Mantle/Mantle&quot;&gt;Mantle&lt;/a&gt; instead of Core Data, and &lt;a href=&quot;https://github.com/mapbox/mapbox-ios-sdk&quot;&gt;Mapbox&lt;/a&gt; instead of MapKit for our &lt;a href=&quot;https://github.com/Burning-Man-Earth/iBurn-Maps&quot;&gt;offline map tiles&lt;/a&gt;. For users of Android devices, &lt;a href=&quot;https://github.com/onlyinamerica&quot;&gt;David Brodsky&lt;/a&gt; developed a version of &lt;a href=&quot;https://github.com/Burning-Man-Earth/iBurn-Android&quot;&gt;iBurn for Android&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://itunes.apple.com/us/app/iburn-2013-burning-man-map/id388169740?mt=8&quot;&gt;&lt;img src=&quot;https://developer.apple.com/app-store/marketing/guidelines/images/badge-download-on-the-app-store.svg&quot; alt=&quot;iBurn App Store Link&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.gaiagps.iburn&amp;amp;hl=en&quot;&gt;&lt;img src=&quot;http://developer.android.com/images/brand/en_generic_rgb_wo_45.png&quot; alt=&quot;iBurn Google Play Store Link&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just don’t get playa dust in your electronics!&lt;/p&gt;

  &lt;p&gt;&lt;a href=&quot;https://ballinger.io/blog/iburn-2014-now-available/&quot;&gt;iBurn 2014 now available for iOS and Android!&lt;/a&gt; was originally published by Chris Ballinger at &lt;a href=&quot;https://ballinger.io&quot;&gt;Chris Ballinger&lt;/a&gt; on August 19, 2014.&lt;/p&gt;</content>
</entry>


<entry>
  <title type="html"><![CDATA[Kickflip - Live Mobile Video Streaming for All!]]></title>
  <link>https://ballinger.io/blog/kickflip-launch/</link>
  <id>https://ballinger.io/blog/kickflip-launch</id>
  <updated>2014-5-19T00:00:00-00:00</updated>
  <published>2014-05-19T00:00:00-07:00</published>
  
  <author>
    <name>Chris Ballinger</name>
    <uri>https://ballinger.io</uri>
    <email>chris@chatsecure.org</email>
  </author>
  <content type="html">&lt;p&gt;&lt;img src=&quot;https://camo.githubusercontent.com/6d379d1a230bb4b46fa6d8e362c9027d93bc617c/687474703a2f2f692e696d6775722e636f6d2f64627156717a4c2e6a7067&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;We just launched Kickflip, our open-source live video broadcasting SDK for iOS and Android. &lt;a href=&quot;https://kickflip.io/blog/kickflip-live-mobile-video-streaming-sdk/&quot;&gt;Check it out!&lt;/a&gt;&lt;/p&gt;

  &lt;p&gt;&lt;a href=&quot;https://ballinger.io/blog/kickflip-launch/&quot;&gt;Kickflip - Live Mobile Video Streaming for All!&lt;/a&gt; was originally published by Chris Ballinger at &lt;a href=&quot;https://ballinger.io&quot;&gt;Chris Ballinger&lt;/a&gt; on May 19, 2014.&lt;/p&gt;</content>
</entry>


<entry>
  <title type="html"><![CDATA[Fixing the XMPP Push Problem]]></title>
  <link>https://ballinger.io/blog/fixing-xmpp-push-problem/</link>
  <id>https://ballinger.io/blog/fixing-xmpp-push-problem</id>
  <updated>2014-4-8T00:00:00-00:00</updated>
  <published>2014-04-08T00:00:00-07:00</published>
  
  <author>
    <name>Chris Ballinger</name>
    <uri>https://ballinger.io</uri>
    <email>chris@chatsecure.org</email>
  </author>
  <content type="html">&lt;p&gt;XMPP is at serious risk of being permanently replaced by proprietary alternatives that have already solved the mobile push messaging problem. Remember in the 90s how many closed IM networks there were? Today it is much worse.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://chatsecure.org/blog/fixing-the-xmpp-push-problem/&quot;&gt;Read the rest&lt;/a&gt; at chatsecure.org.&lt;/p&gt;

  &lt;p&gt;&lt;a href=&quot;https://ballinger.io/blog/fixing-xmpp-push-problem/&quot;&gt;Fixing the XMPP Push Problem&lt;/a&gt; was originally published by Chris Ballinger at &lt;a href=&quot;https://ballinger.io&quot;&gt;Chris Ballinger&lt;/a&gt; on April 08, 2014.&lt;/p&gt;</content>
</entry>


<entry>
  <title type="html"><![CDATA[Weakness of the One-Time Pad]]></title>
  <link>https://ballinger.io/blog/one-time-pad-weakness/</link>
  <id>https://ballinger.io/blog/one-time-pad-weakness</id>
  <updated>2014-1-19T00:00:00-00:00</updated>
  <published>2014-01-19T00:00:00-08:00</published>
  
  <author>
    <name>Chris Ballinger</name>
    <uri>https://ballinger.io</uri>
    <email>chris@chatsecure.org</email>
  </author>
  <content type="html">&lt;p&gt;I’ve been taking Coursera’s &lt;a href=&quot;https://class.coursera.org/crypto-009&quot;&gt;Stanford Cryptography I&lt;/a&gt; class and last week’s homework had an interesting extra credit problem: given eleven ciphertexts all encrypted with the same &lt;a href=&quot;https://en.wikipedia.org/wiki/One-time_pad&quot;&gt;one-time pad&lt;/a&gt; key, find the plaintext of the last ciphertext. It included a hint to &lt;a href=&quot;https://en.wikipedia.org/wiki/XOR_cipher&quot;&gt;XOR&lt;/a&gt; the ciphertexts together and to take a note of what happens when you XOR a space with lowercase and uppercase characters.&lt;/p&gt;

&lt;p&gt;When I initially went to solve the problem, I thought that it would make the most sense to use &lt;a href=&quot;https://en.wikipedia.org/wiki/Frequency_analysis&quot;&gt;frequency analysis&lt;/a&gt; but hit a dead-end after a few hours and felt pretty frustrated. However, after studying the hint more carefully, I realized:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;'ABC' XOR '   ' = 'abc'
'abc' XOR '   ' = 'ABC'
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Eureka! If you combine that with these properties of XOR:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;'plain text' XOR 'secretkeys' = 0x0309021b0b541f000107
'safe texts' XOR 'secretkeys' = 0x0004051745000e1d0d00

'plain text' XOR 0x0309021b0b541f000107 = 'secretkeys'
'safe texts' XOR 0x0004051745000e1d0d00 = 'secretkeys'

0x030d070c4e54111d0c07 = 'plain text' XOR 'safe texts'
0x030d070c4e54111d0c07 = 0x0309021b0b541f000107 XOR 0x0004051745000e1d0d00
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Pay close attention to the last two lines. You’ll notice that the XOR of two ciphertexts encoded with the same OTP key is identical to the XOR of the two plaintexts. Now, let’s look closer at the contents of &lt;code class=&quot;highlighter-rouge&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;0x030d070c4e54111d0c07&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;['\x03', '\r', '\x07', '\x0c', 'N', 'T', '\x11', '\x1d', '\x0c', '\x07']
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You’ll notice the uppercase ‘N’ and ‘T’ characters definitely stand out. From what we learned earlier, this means that the 5th position of the two original plaintexts has a 50% chance of being either a space or a lowercase ‘n’, and the 6th position is either a ‘t’ or a space.&lt;/p&gt;

&lt;p&gt;** Spoiler Alert: If you’re currently taking this class and haven’t completed this homework, please do not read any further until you have solved it on your own. Your solution will likely be better than mine. **&lt;/p&gt;

&lt;p&gt;I used this knowledge, along with the XOR permutation of the 11 given ciphertexts with each other to assemble the probability of each character at a given index. Basically, I had a parallel ‘probability’ array that kept track of the chance of each character occurring at each index.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;scan_string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;probability_arrays&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ct1_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ct2_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;    &lt;span class=&quot;n&quot;&gt;characters&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;    &lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;character_index&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)):&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;        &lt;span class=&quot;n&quot;&gt;character&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;characters&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;character_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;        &lt;span class=&quot;n&quot;&gt;letter&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scan_for_letter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;character&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;letter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;            &lt;span class=&quot;n&quot;&gt;set_letter_at_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;letter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;character_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;probability_arrays&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ct1_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ct2_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;            &lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;permute_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cipher_texts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;probability_arrays&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cipher_texts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)):&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cipher_texts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)):&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;            &lt;span class=&quot;n&quot;&gt;xor&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;xor_indices&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cipher_texts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;            &lt;span class=&quot;n&quot;&gt;scan_string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;probability_arrays&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;The &lt;code class=&quot;highlighter-rouge&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;scan_for_letter&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt; function checks if a given character is within [a-zA-Z] and returns the swapped case of that letter if found. The &lt;code class=&quot;highlighter-rouge&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;set_letter_at_index&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt; function helps us keep track of the occurance of each letter by recording both a space and the letter in two probability arrays, each array corresponding to the one of the two currently XORed ciphertext pairs.&lt;/p&gt;

&lt;p&gt;It ends up looking something like this:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;1. [{'T': 3, ' ': 3}, {'h': 3, ' ': 3}, {'e': 3, ' ': 3}, {' ': 2, 'e': 2, 'r': 2}, {}, ...]
...
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I figured that if for a given index, a non-space character with a 0.5 probability was probably that character. For a short-cut, basically all 2-element letter probability dictionaries could be assumed to be whatever non-space character was present. Otherwise, if there is no clear letter match, it is probably a space character. Sometimes there are no letter matches at all so I output a ‘&lt;code class=&quot;highlighter-rouge&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;*&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;’ instead, with the final output looking something like this:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;1. The *...
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;most_probable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prob_dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prob_dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;' '&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;    &lt;span class=&quot;n&quot;&gt;total_character_count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;    &lt;span class=&quot;n&quot;&gt;keys&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prob_dict&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;keys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;key&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;keys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;        &lt;span class=&quot;n&quot;&gt;character_count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prob_dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;        &lt;span class=&quot;n&quot;&gt;total_character_count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;total_character_count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;character_count&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;key&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;keys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;        &lt;span class=&quot;n&quot;&gt;prob_dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prob_dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;total_character_count&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;    &lt;span class=&quot;n&quot;&gt;highest_probability_index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;keys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)):&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;        &lt;span class=&quot;n&quot;&gt;key&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;keys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;        &lt;span class=&quot;n&quot;&gt;probability&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prob_dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;        &lt;span class=&quot;n&quot;&gt;highest_probability&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prob_dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;keys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;highest_probability_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;probability&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;highest_probability&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;            &lt;span class=&quot;n&quot;&gt;highest_probability_index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;    &lt;span class=&quot;n&quot;&gt;most_probable_key&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;keys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;highest_probability_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;most_probable_key&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;The &lt;code class=&quot;highlighter-rouge&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;most_probable&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt; function probably isn’t the most efficient or beautiful way of calculating this, but it is very useful and I end up reusing it later when refining the key guesses. You could have stopped right here and had a reasonable guess for each original plaintext, missing some characters here and there.&lt;/p&gt;

&lt;p&gt;However, I thought that I could improve the accuracy of my plaintexts by guessing the key that the most generated plaintexts had in common with each other. I re-used the &lt;code class=&quot;highlighter-rouge&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;most_probable&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt; function to find the most common key by keeping track of the key bytes at each character index and finding the most commonly shared key. This allowed me to find the non-letter characters that were left, like punctuation and even the sneaky single-character ‘&lt;code class=&quot;highlighter-rouge&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;ﬁ&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;’ present in one of the plaintexts.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;guess_key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;guess_texts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cipher_texts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;    &lt;span class=&quot;n&quot;&gt;key_guess_probabilities&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;generate_key_guess_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;length_of_longest_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;guess_texts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt; &lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;guess_texts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)):&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;        &lt;span class=&quot;n&quot;&gt;guess_text&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;guess_texts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;        &lt;span class=&quot;n&quot;&gt;key_guess&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;strxor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cipher_texts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;decode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;hex&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;guess_text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;        &lt;span class=&quot;n&quot;&gt;update_key_probabilities&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;key_guess&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;key_guess_probabilities&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt; &lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;    &lt;span class=&quot;n&quot;&gt;key_guess&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;guess_key_from_probabilities&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;key_guess_probabilities&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;br data-jekyll-commonmark-ghpages=&quot;&quot; /&gt;    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;key_guess&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Unfortunately my solution still has bugs (can you find them?) and I wasn’t able to completely automate the key-finding process. There were still a bunch of garbage characters that I needed to guess based on context clues. I ended up repeatedly running the &lt;code class=&quot;highlighter-rouge&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;guess_key&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt; function on manually refined plaintexts until I found the original OTP key that decrypts all of the ciphertexts in their entirety.&lt;/p&gt;

&lt;p&gt;I could have automated the process a bit more by using an English dictionary and guessing the missing characters within words using the &lt;a href=&quot;https://en.wikipedia.org/wiki/Levenshtein_distance&quot;&gt;Levenshtein distance&lt;/a&gt; to known words, but I don’t know how well that would work. I’m still interested in a completely automated solution that doesn’t require any manual intervention but, for now, this will have to do.&lt;/p&gt;

&lt;p&gt;Remember, never use the same OTP key more than once or your ciphertexts will leak information about the original plaintexts and eventually reveal your key.&lt;/p&gt;

&lt;p&gt;If you’re interested in the rest of the source code, it’s available as &lt;a href=&quot;https://gist.github.com/chrisballinger/8515411&quot;&gt;redacted Gist&lt;/a&gt; on GitHub.&lt;/p&gt;

  &lt;p&gt;&lt;a href=&quot;https://ballinger.io/blog/one-time-pad-weakness/&quot;&gt;Weakness of the One-Time Pad&lt;/a&gt; was originally published by Chris Ballinger at &lt;a href=&quot;https://ballinger.io&quot;&gt;Chris Ballinger&lt;/a&gt; on January 19, 2014.&lt;/p&gt;</content>
</entry>


<entry>
  <title type="html"><![CDATA[ChatSecure Website Redesign]]></title>
  <link>https://ballinger.io/blog/chatsecure-website-redesign/</link>
  <id>https://ballinger.io/blog/chatsecure-website-redesign</id>
  <updated>2014-1-10T00:00:00-00:00</updated>
  <published>2014-01-10T00:00:00-08:00</published>
  
  <author>
    <name>Chris Ballinger</name>
    <uri>https://ballinger.io</uri>
    <email>chris@chatsecure.org</email>
  </author>
  <content type="html">&lt;p&gt;I just finished redesigning &lt;a href=&quot;https://chatsecure.org&quot;&gt;chatsecure.org&lt;/a&gt; (&lt;a href=&quot;https://github.com/chatsecure/chatsecure.github.io&quot;&gt;source code&lt;/a&gt;) with &lt;a href=&quot;http://jekyllrb.com&quot;&gt;Jekyll&lt;/a&gt; and the beautiful &lt;a href=&quot;http://incorporated.sendtoinc.com&quot;&gt;Incorporated&lt;/a&gt; theme. Here’s a link to the &lt;a href=&quot;https://web.archive.org/web/20131017232603/https://chatsecure.org/&quot;&gt;old version&lt;/a&gt; of the website for reference.&lt;/p&gt;

&lt;p&gt;One of the main motivations for the redesign was to include information about the recently re-branded Android version of ChatSecure (previously it was called Gibberbot). A large number of support requests for Android started showing up in the iOS GitHub Issues and UserVoice pages, so hopefully this new design should help guide people in the right direction.&lt;/p&gt;

&lt;p&gt;Overall I have been very pleased with the zen of writing blog posts and other content in Markdown, and keeping it version controlled with git. Storing text in a database (especially without version control) just seems so broken now.&lt;/p&gt;

  &lt;p&gt;&lt;a href=&quot;https://ballinger.io/blog/chatsecure-website-redesign/&quot;&gt;ChatSecure Website Redesign&lt;/a&gt; was originally published by Chris Ballinger at &lt;a href=&quot;https://ballinger.io&quot;&gt;Chris Ballinger&lt;/a&gt; on January 10, 2014.&lt;/p&gt;</content>
</entry>


<entry>
  <title type="html"><![CDATA[ChatSecure]]></title>
  <link>https://ballinger.io/apps/chatsecure/</link>
  <id>https://ballinger.io/apps/chatsecure</id>
  <updated>2014-1-10T00:00:00-00:00</updated>
  <published>2013-12-31T00:00:00-08:00</published>
  
  <author>
    <name>Chris Ballinger</name>
    <uri>https://ballinger.io</uri>
    <email>chris@chatsecure.org</email>
  </author>
  <content type="html">&lt;p&gt;&lt;img src=&quot;/images/chatsecure-banner.png&quot; alt=&quot;ChatSecure Logo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://chatsecure.org&quot;&gt;ChatSecure&lt;/a&gt; is a free and open source encrypted chat client for iPhone and Android that supports &lt;a href=&quot;https://en.wikipedia.org/wiki/Off-the-Record_Messaging&quot;&gt;OTR encryption&lt;/a&gt; over &lt;a href=&quot;https://en.wikipedia.org/wiki/Xmpp&quot;&gt;XMPP&lt;/a&gt;. ChatSecure was originally available for only iOS devices, but is now also available on Android via &lt;a href=&quot;https://guardianproject.info&quot;&gt;The Guardian Project&lt;/a&gt;’s similar app, formerly named &lt;a href=&quot;https://guardianproject.info/apps/chatsecure/&quot;&gt;Gibberbot&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;ChatSecure is available on the Apple App Store and Google Play Store for free.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://itunes.apple.com/us/app/chatsecure/id464200063&quot;&gt;&lt;img src=&quot;/images/appstore.png&quot; alt=&quot;ChatSecure for iPhone&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;https://play.google.com/store/apps/details?id=info.guardianproject.otr.app.im&amp;amp;hl=en&quot;&gt;&lt;img src=&quot;/images/playstore.png&quot; alt=&quot;ChatSecure for Android&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also follow ChatSecure on &lt;a href=&quot;https://twitter.com/ChatSecure&quot;&gt;Twitter&lt;/a&gt; or &lt;a href=&quot;https://www.facebook.com/chatsecure&quot;&gt;Facebook&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id=&quot;support&quot;&gt;Support&lt;/h1&gt;

&lt;h3 id=&quot;ios-support&quot;&gt;iOS Support&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/chrisballinger/Off-the-Record-iOS/issues&quot;&gt;GitHub Issues - iOS&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://chatsecure.uservoice.com/forums/193939-chatsecure-ios&quot;&gt;UserVoice - iOS&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Please report iOS security-related issues directly to &lt;a href=&quot;mailto:chris@chatsecure.org&quot;&gt;chris@chatsecure.org&lt;/a&gt; (&lt;a href=&quot;https://chatsecure.org/assets/pubkeys/50F7D255.asc&quot;&gt;GPG 50F7D255&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;android-support&quot;&gt;Android Support&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/guardianproject/ChatSecureAndroid/issues&quot;&gt;GitHub Issues - Android&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://chatsecure.uservoice.com/forums/229504-chatsecure-android&quot;&gt;UserVoice - Android&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://dev.guardianproject.info/projects/gibberbot&quot;&gt;Bug Tracker - Android&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Please report Android security-related issues directly to &lt;a href=&quot;mailto:nathan@guardianproject.info&quot;&gt;Nathan Freitas&lt;/a&gt; (&lt;a href=&quot;https://chatsecure.org/assets/pubkeys/69B37AA9.asc&quot;&gt;GPG 69B37AA9&lt;/a&gt;) of &lt;a href=&quot;https://guardianproject.info/home/team/&quot;&gt;The Guardian Project Team&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;source-code&quot;&gt;Source Code&lt;/h1&gt;

&lt;p&gt;The source code for both projects is hosted on GitHub.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/chrisballinger/Off-the-Record-iOS&quot;&gt;iOS&lt;/a&gt; / &lt;a href=&quot;https://github.com/chrisballinger/Off-the-Record-iOS/blob/master/LICENSE&quot;&gt;License&lt;/a&gt; (GPLv3+) [&lt;a href=&quot;https://github.com/chrisballinger/Off-the-Record-iOS/blob/master/CONTRIBUTING.md&quot;&gt;Contributing&lt;/a&gt;]&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/guardianproject/ChatSecureAndroid&quot;&gt;Android&lt;/a&gt; / &lt;a href=&quot;https://github.com/guardianproject/ChatSecureAndroid/blob/master/LICENSE&quot;&gt;License&lt;/a&gt; (Apache 2.0)&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;donate&quot;&gt;Donate&lt;/h1&gt;

&lt;p&gt;We accept &lt;a href=&quot;https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;amp;hosted_button_id=XRBHJ9AX5VWNA&quot;&gt;PayPal&lt;/a&gt; and &lt;a href=&quot;https://coinbase.com/checkouts/1cf35f00d722205726f50b940786c413&quot;&gt;Bitcoin&lt;/a&gt; donations for the iOS version. Thank you!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://coinbase.com/checkouts/1cf35f00d722205726f50b940786c413&quot;&gt;&lt;img src=&quot;https://chatsecure.org/images/bitcoin_donate.png&quot; alt=&quot;bitcoin&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;amp;hosted_button_id=XRBHJ9AX5VWNA&quot;&gt;&lt;img src=&quot;https://chatsecure.org/images/paypal_donate.png&quot; alt=&quot;donation&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

  &lt;p&gt;&lt;a href=&quot;https://ballinger.io/apps/chatsecure/&quot;&gt;ChatSecure&lt;/a&gt; was originally published by Chris Ballinger at &lt;a href=&quot;https://ballinger.io&quot;&gt;Chris Ballinger&lt;/a&gt; on December 31, 2013.&lt;/p&gt;</content>
</entry>


<entry>
  <title type="html"><![CDATA[First Post]]></title>
  <link>https://ballinger.io/blog/first-post/</link>
  <id>https://ballinger.io/blog/first-post</id>
  <updated>2013-12-29T00:00:00-00:00</updated>
  <published>2013-12-29T00:00:00-08:00</published>
  
  <author>
    <name>Chris Ballinger</name>
    <uri>https://ballinger.io</uri>
    <email>chris@chatsecure.org</email>
  </author>
  <content type="html">&lt;figure&gt;
	&lt;img src=&quot;https://ballinger.io/images/big-construction.gif&quot; alt=&quot;Nothing like good old Geocities.&quot; /&gt;&lt;img src=&quot;https://ballinger.io/images/digging.gif&quot; /&gt;&lt;img src=&quot;https://ballinger.io/images/tractor.gif&quot; /&gt;&lt;img src=&quot;https://ballinger.io/images/blinky.gif&quot; /&gt;
	&lt;figcaption&gt;&lt;a href=&quot;http://www.textfiles.com/underconstruction/&quot; title=&quot;Please be patient - This Page is Under Construction!&quot;&gt;Please be patient - This Page is Under Construction!&lt;/a&gt;.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;This is my first post using &lt;a href=&quot;http://jekyllrb.com&quot;&gt;Jekyll&lt;/a&gt;. Please pardon the mess.&lt;/p&gt;

  &lt;p&gt;&lt;a href=&quot;https://ballinger.io/blog/first-post/&quot;&gt;First Post&lt;/a&gt; was originally published by Chris Ballinger at &lt;a href=&quot;https://ballinger.io&quot;&gt;Chris Ballinger&lt;/a&gt; on December 29, 2013.&lt;/p&gt;</content>
</entry>

</feed>
