<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
xmlns:rawvoice="http://www.rawvoice.com/rawvoiceRssModule/"
	>
<channel>
	<title>Comments on: The Kid Sister Crypto Manifesto</title>
	<atom:link href="http://enfranchisedmind.com/blog/posts/the-kid-sister-crypto-manifesto/feed/" rel="self" type="application/rss+xml" />
	<link>http://enfranchisedmind.com/blog/posts/the-kid-sister-crypto-manifesto/</link>
	<description>programming, politics, &#38; other religious issues</description>
	<lastBuildDate>Wed, 08 Feb 2012 14:16:00 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
	<item>
		<title>By: Brian</title>
		<link>http://enfranchisedmind.com/blog/posts/the-kid-sister-crypto-manifesto/#comment-32898</link>
		<dc:creator>Brian</dc:creator>
		<pubDate>Thu, 27 Mar 2008 00:06:20 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/2008/03/16/the-kid-sister-crypto-manifesto/#comment-32898</guid>
		<description>I asked:
&lt;BLOCKQUOTE&gt;This raises the question of why all the thousands of implementations of pseudo-random number generators and hash functions don’t use strong crypto?&lt;/BLOCKQUOTE&gt;

You answered:
&lt;BLOCKQUOTE&gt;1. unnecessary (in the case of random generators not meant for crypto, hash functions not meant for security)&lt;/BLOCKQUOTE&gt;

So you agree that there are legitimate reasons to not use strong crypto (for the record, I consider md5 strong crypto- not that it isn&#039;t broken, but it wasn&#039;t &lt;EM&gt;designed&lt;/EM&gt; to be broken).  So if you aren&#039;t going to be using strong crypto for legimate reasons, why not use weak crypto?  

There has been a hell of a lot of thought and effort, by a large number of exceedingly bright people, put into making crypto systems both fast and secure.  Now, I&#039;m not Bruce Schneier or Ron Rivest.  I&#039;m not good enough to try my hand at making my own strong crypto.  But I&#039;ve read a fair bit of the literature and know the &quot;rules of thumb&quot; that have been learned over the years on what things make a good and fast crypto system.  And the question arose- why aren&#039;t we taking advantage of this knowledge, even in situations where we&#039;re not going to use strong crypto?  &quot;Cryptographic sensibilities&quot; was a bad turn of phrase- &quot;Cryptographic experience&quot; would be a better one.  Why aren&#039;t Feistel Networks more popular in pseudo-random number generators and hash functions?

One other point- you keep seeming to assume crypto=communication.  That&#039;s one use, yes.  There are others.  If you&#039;re doing communication, use strong crypto, the strongest you can.  Generally, the crypto isn&#039;t going to be the bottleneck (modern crypto systems are fast, especially compared to the growing disparity between modern CPUs and modern communication channels), and using a broken crypto system is no better than not using one at all.  But that doesn&#039;t mean there isn&#039;t a use for broken crypto systems- pseudorandom number generation and hash functions for hash tables being two obvious examples where &quot;broken&quot; in the cryptographic sense isn&#039;t a problem.</description>
		<content:encoded><![CDATA[<p>I asked:</p>
<blockquote><p>This raises the question of why all the thousands of implementations of pseudo-random number generators and hash functions don’t use strong crypto?</p></blockquote>
<p>You answered:</p>
<blockquote><p>1. unnecessary (in the case of random generators not meant for crypto, hash functions not meant for security)</p></blockquote>
<p>So you agree that there are legitimate reasons to not use strong crypto (for the record, I consider md5 strong crypto- not that it isn&#8217;t broken, but it wasn&#8217;t <em>designed</em> to be broken).  So if you aren&#8217;t going to be using strong crypto for legimate reasons, why not use weak crypto?  </p>
<p>There has been a hell of a lot of thought and effort, by a large number of exceedingly bright people, put into making crypto systems both fast and secure.  Now, I&#8217;m not Bruce Schneier or Ron Rivest.  I&#8217;m not good enough to try my hand at making my own strong crypto.  But I&#8217;ve read a fair bit of the literature and know the &#8220;rules of thumb&#8221; that have been learned over the years on what things make a good and fast crypto system.  And the question arose- why aren&#8217;t we taking advantage of this knowledge, even in situations where we&#8217;re not going to use strong crypto?  &#8220;Cryptographic sensibilities&#8221; was a bad turn of phrase- &#8220;Cryptographic experience&#8221; would be a better one.  Why aren&#8217;t Feistel Networks more popular in pseudo-random number generators and hash functions?</p>
<p>One other point- you keep seeming to assume crypto=communication.  That&#8217;s one use, yes.  There are others.  If you&#8217;re doing communication, use strong crypto, the strongest you can.  Generally, the crypto isn&#8217;t going to be the bottleneck (modern crypto systems are fast, especially compared to the growing disparity between modern CPUs and modern communication channels), and using a broken crypto system is no better than not using one at all.  But that doesn&#8217;t mean there isn&#8217;t a use for broken crypto systems- pseudorandom number generation and hash functions for hash tables being two obvious examples where &#8220;broken&#8221; in the cryptographic sense isn&#8217;t a problem.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: mind</title>
		<link>http://enfranchisedmind.com/blog/posts/the-kid-sister-crypto-manifesto/#comment-32880</link>
		<dc:creator>mind</dc:creator>
		<pubDate>Tue, 25 Mar 2008 05:01:59 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/2008/03/16/the-kid-sister-crypto-manifesto/#comment-32880</guid>
		<description>&gt; This raises the question of why all the thousands of implementations of pseudo-random number generators and hash functions don’t use strong crypto?

1. unnecessary (in the case of random generators not meant for crypto, hash functions not meant for security)
2. ignorance (not invented here, &quot;its not that hard&quot;, etc)
3. legacy (md5)

&gt; the status of exporting cryptographic algorithms out of the US is still at best ambiguous

Sure. But many algorithms have been exported. Concentrate on building _systems_ out of those blocks. ECC doesn&#039;t get you any new capabilities over Elgamal with multiplicative groups.

The last thing I want to do is _discourage_ people getting interested in crypto. But designing your own (already broken) low-level algorithms is just needlessly spinning your wheels.

&gt; But a major one is performance

Do you have examples? Pidgin-encryption creates a noticeable performance hit, but that&#039;s because it does a public key operation for every message. Heavy traffic websites forgo encryption for performance, but I doubt they want _any_ performance hit, especially for already deployed crypto.

&gt; The point of the whole manifesto is that if we’re going to be using these weak cryptographic protocols anyways, we might as well use weak cryptographic protocols designed with at least some cryptographic sensibilities.

&quot;cryptographic sensibilities&quot; involve not using weak algorithms. there really is no middle ground. If your goal is to simply not be shipping around the original message, you should be calling your goal &quot;obfuscation&quot;.

I agree that the perfect can be the enemy of the good. But if you&#039;re looking to compromise to get more adopting, look at the PKI. Both Certificate Authorities and PGP web of trust completely suck. They set up serious usability issues which discourage adoption. (My comments here are kind of penance for advocating anonymous diffie-hellman over on reddit)

&gt; The other problem is the installed base of insecure, non-crypto, protocols.

Most definitely. I just don&#039;t think that replacing them with insecure crypto protocols helps things. If you&#039;re looking to get anything moderately adopted, one of the key points is &quot;not broken&quot;. Else, it&#039;s just a curious toy.

&gt; ditch the Republicans, and those Vichyist Democrats who side with them

you&#039;ve just included the last _28 years_ of presidents there. good luck</description>
		<content:encoded><![CDATA[<p>&gt; This raises the question of why all the thousands of implementations of pseudo-random number generators and hash functions don’t use strong crypto?</p>
<p>1. unnecessary (in the case of random generators not meant for crypto, hash functions not meant for security)<br />
2. ignorance (not invented here, &#8220;its not that hard&#8221;, etc)<br />
3. legacy (md5)</p>
<p>&gt; the status of exporting cryptographic algorithms out of the US is still at best ambiguous</p>
<p>Sure. But many algorithms have been exported. Concentrate on building _systems_ out of those blocks. ECC doesn&#8217;t get you any new capabilities over Elgamal with multiplicative groups.</p>
<p>The last thing I want to do is _discourage_ people getting interested in crypto. But designing your own (already broken) low-level algorithms is just needlessly spinning your wheels.</p>
<p>&gt; But a major one is performance</p>
<p>Do you have examples? Pidgin-encryption creates a noticeable performance hit, but that&#8217;s because it does a public key operation for every message. Heavy traffic websites forgo encryption for performance, but I doubt they want _any_ performance hit, especially for already deployed crypto.</p>
<p>&gt; The point of the whole manifesto is that if we’re going to be using these weak cryptographic protocols anyways, we might as well use weak cryptographic protocols designed with at least some cryptographic sensibilities.</p>
<p>&#8220;cryptographic sensibilities&#8221; involve not using weak algorithms. there really is no middle ground. If your goal is to simply not be shipping around the original message, you should be calling your goal &#8220;obfuscation&#8221;.</p>
<p>I agree that the perfect can be the enemy of the good. But if you&#8217;re looking to compromise to get more adopting, look at the PKI. Both Certificate Authorities and PGP web of trust completely suck. They set up serious usability issues which discourage adoption. (My comments here are kind of penance for advocating anonymous diffie-hellman over on reddit)</p>
<p>&gt; The other problem is the installed base of insecure, non-crypto, protocols.</p>
<p>Most definitely. I just don&#8217;t think that replacing them with insecure crypto protocols helps things. If you&#8217;re looking to get anything moderately adopted, one of the key points is &#8220;not broken&#8221;. Else, it&#8217;s just a curious toy.</p>
<p>&gt; ditch the Republicans, and those Vichyist Democrats who side with them</p>
<p>you&#8217;ve just included the last _28 years_ of presidents there. good luck</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Brian</title>
		<link>http://enfranchisedmind.com/blog/posts/the-kid-sister-crypto-manifesto/#comment-32853</link>
		<dc:creator>Brian</dc:creator>
		<pubDate>Thu, 20 Mar 2008 23:50:39 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/2008/03/16/the-kid-sister-crypto-manifesto/#comment-32853</guid>
		<description>mind:  This raises the question of why all the thousands of implementations of pseudo-random number generators and hash functions &lt;EM&gt;don&#039;t&lt;/EM&gt; use strong crypto?

There are a number of reasons.  One is legal- the status of exporting cryptographic algorithms out of the US is still at best ambiguous.  It&#039;s certainly not worth the hassle for a simple pseudo-random number generator or hash algorithm in some utility library.  Another is complexity.  But a major one is performance.  Strong cryptographic properties are not necessary in these situations, and the cost in performance for using an unnecessarily strong crypto is paid for by all users of the library, and all users of all programs using the library.

The point of the whole manifesto is that if we&#039;re going to be using these weak cryptographic protocols anyways, we might as well use weak cryptographic protocols designed with at least some cryptographic sensibilities.

As for making cryptography so easy my kid sister can use it. the best way to do that is to just have it builti-in.  There are two main impediments to building strong crypto in.  The political end I&#039;ve mentioned.  The other problem is the installed base of insecure, non-crypto, protocols.  The first one I have a solution for (ditch the Republicans, and those Vichyist Democrats who side with them).  The second one I have no idea how to tackle.</description>
		<content:encoded><![CDATA[<p>mind:  This raises the question of why all the thousands of implementations of pseudo-random number generators and hash functions <em>don&#8217;t</em> use strong crypto?</p>
<p>There are a number of reasons.  One is legal- the status of exporting cryptographic algorithms out of the US is still at best ambiguous.  It&#8217;s certainly not worth the hassle for a simple pseudo-random number generator or hash algorithm in some utility library.  Another is complexity.  But a major one is performance.  Strong cryptographic properties are not necessary in these situations, and the cost in performance for using an unnecessarily strong crypto is paid for by all users of the library, and all users of all programs using the library.</p>
<p>The point of the whole manifesto is that if we&#8217;re going to be using these weak cryptographic protocols anyways, we might as well use weak cryptographic protocols designed with at least some cryptographic sensibilities.</p>
<p>As for making cryptography so easy my kid sister can use it. the best way to do that is to just have it builti-in.  There are two main impediments to building strong crypto in.  The political end I&#8217;ve mentioned.  The other problem is the installed base of insecure, non-crypto, protocols.  The first one I have a solution for (ditch the Republicans, and those Vichyist Democrats who side with them).  The second one I have no idea how to tackle.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: mind</title>
		<link>http://enfranchisedmind.com/blog/posts/the-kid-sister-crypto-manifesto/#comment-32842</link>
		<dc:creator>mind</dc:creator>
		<pubDate>Thu, 20 Mar 2008 06:05:34 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/2008/03/16/the-kid-sister-crypto-manifesto/#comment-32842</guid>
		<description>a post called &quot;the kid sister crypto manifesto&quot; should focus on making encryption so easy to use that your &quot;kid sister&quot; can use it.

&quot;standard&quot; crypto is *not* too slow. advocating a broken algorithm because it&#039;s faster is (premature optimization)^256.

take the key and xor its repetition with the plaintext if you&#039;re looking for a fast, broken system.</description>
		<content:encoded><![CDATA[<p>a post called &#8220;the kid sister crypto manifesto&#8221; should focus on making encryption so easy to use that your &#8220;kid sister&#8221; can use it.</p>
<p>&#8220;standard&#8221; crypto is *not* too slow. advocating a broken algorithm because it&#8217;s faster is (premature optimization)^256.</p>
<p>take the key and xor its repetition with the plaintext if you&#8217;re looking for a fast, broken system.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Brian</title>
		<link>http://enfranchisedmind.com/blog/posts/the-kid-sister-crypto-manifesto/#comment-32841</link>
		<dc:creator>Brian</dc:creator>
		<pubDate>Thu, 20 Mar 2008 00:33:30 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/2008/03/16/the-kid-sister-crypto-manifesto/#comment-32841</guid>
		<description>David: I didn&#039;t go into endian issues for several reasons.  One, it&#039;s not really germane to the core algorithm.  Two, it&#039;s a pretty easy decisions: big endian, little endian.  Pick one.  Three, endian issues are generally arise when two (or more) computers are communicating.  If you&#039;re using KSC for private communication, I recommend ROT-13 instead- it can be implemented faster, and it provides similar security.  Communication channels are slow enough compared to CPUs these days that the overhead of using a real cipher (like AES) isn&#039;t a problem.  I suppose it could be used as a checksum, in which case I&#039;d probably just pick an endianess and define it.

But the main reason I didn&#039;t define an endianess is because the two main uses for KSC that I see (pseudo-random number generation and hash functions for hash tables) don&#039;t need or want a defined endianess.  For the pseudo-random number case, both the state and the output would be stored as unsigned longs in the native endianess.  Converting to and from some foreign endianess would be pointless.  For hash functions, the problem breaks down into two parts- a hash &lt;EM&gt;algorithm&lt;/EM&gt; (for which KSC is a good choice), and a serialization algorithm, which converts arbitrary data structures into a stream of bytes or words which can then be run through the hash algorithm.

The serialization problem encompasses endianess issues, and a whole lot more.  How do you serialize a tree?  Or an array?  How about short integers?  Do you sign extend them, or not?  Expand each short integer into a full sized word, or pack multiple short integers into a single word?  How about multi-word &quot;bignum&quot; integers?  Floats present all sorts of problem, given than there&#039;s no standard I know of that defines which bits in a float are the exponent, which are the mantissa, and which the sign (IEEE 754 says how many bits of each a float will have, but not where in the word they are).  Plus you&#039;ve got the issue of NaNs and Infinities (both positive and negative), all of which have multiple different encodes, all of which are in some sense equal (or not, in the case of NaN).  Even strings can having surprising serialization problems- UTF-8 or UTF-16?  Or code points?  Include the nul at the end of the string or not?  How about the length?  And if you include the length, as what size integer?

None of these problems are particularly hard to solve, just pick an answer and move on.  Any set of decisions I might try to make would probably be a bad choice somewhere.  For example, if I were implementing a hash functions using KSC in Java, I&#039;d probably do strings as UTF-16 encoding, which is natural in Java.  In C or Ocaml, I&#039;d probably use the natural UTF-8 encoding.  Am I going to disallow using KSC simply because how the algorithm serializes strings is different?  The point here is that defining a serialization algorithm was beyond the scope of what I was trying to do.  

As for copyright, I really hadn&#039;t thought about it.  I&#039;ve placed the document itself under a permissive CC license.  The code has the same copyright- just throw in a comment like &quot;Kid Sister Crypto by Brian Hurt&quot; and you&#039;re good to go.  Although this probably isn&#039;t the code you want to use- I wrote the code in the example explicitly to be easy to understand, not to be fast or small.  There are several obvious optimizations that probably should be made, like inlining the subround function.  The algorithm is public domain- it&#039;s not patented as far as I know, and as far as I&#039;m concerned it&#039;s not &lt;EM&gt;patentable&lt;/EM&gt;.  My whole point was to use well known, well understood, common components and structures.  The only novel idea in the whole work is the problem itself.

If patents or copyrights still worry you, change the algorithm.  Change the constants- which are halfway arbitrary anyways.  Replace the PHT in the key schedule with a rotate, maybe.  Etc.  The main strength of KSC comes from it&#039;s Feistel Network strucuture- and Feistel Networks come out of the 1960&#039;s and DES, they&#039;ve been around since the begining of time (1 Jan 1970).  You&#039;ll likely end up with an algorithm more or less as good as KSC, but it&#039;s a different algorithm, and thus not covered by and patents or copyrights on KSC.</description>
		<content:encoded><![CDATA[<p>David: I didn&#8217;t go into endian issues for several reasons.  One, it&#8217;s not really germane to the core algorithm.  Two, it&#8217;s a pretty easy decisions: big endian, little endian.  Pick one.  Three, endian issues are generally arise when two (or more) computers are communicating.  If you&#8217;re using KSC for private communication, I recommend ROT-13 instead- it can be implemented faster, and it provides similar security.  Communication channels are slow enough compared to CPUs these days that the overhead of using a real cipher (like AES) isn&#8217;t a problem.  I suppose it could be used as a checksum, in which case I&#8217;d probably just pick an endianess and define it.</p>
<p>But the main reason I didn&#8217;t define an endianess is because the two main uses for KSC that I see (pseudo-random number generation and hash functions for hash tables) don&#8217;t need or want a defined endianess.  For the pseudo-random number case, both the state and the output would be stored as unsigned longs in the native endianess.  Converting to and from some foreign endianess would be pointless.  For hash functions, the problem breaks down into two parts- a hash <em>algorithm</em> (for which KSC is a good choice), and a serialization algorithm, which converts arbitrary data structures into a stream of bytes or words which can then be run through the hash algorithm.</p>
<p>The serialization problem encompasses endianess issues, and a whole lot more.  How do you serialize a tree?  Or an array?  How about short integers?  Do you sign extend them, or not?  Expand each short integer into a full sized word, or pack multiple short integers into a single word?  How about multi-word &#8220;bignum&#8221; integers?  Floats present all sorts of problem, given than there&#8217;s no standard I know of that defines which bits in a float are the exponent, which are the mantissa, and which the sign (IEEE 754 says how many bits of each a float will have, but not where in the word they are).  Plus you&#8217;ve got the issue of NaNs and Infinities (both positive and negative), all of which have multiple different encodes, all of which are in some sense equal (or not, in the case of NaN).  Even strings can having surprising serialization problems- UTF-8 or UTF-16?  Or code points?  Include the nul at the end of the string or not?  How about the length?  And if you include the length, as what size integer?</p>
<p>None of these problems are particularly hard to solve, just pick an answer and move on.  Any set of decisions I might try to make would probably be a bad choice somewhere.  For example, if I were implementing a hash functions using KSC in Java, I&#8217;d probably do strings as UTF-16 encoding, which is natural in Java.  In C or Ocaml, I&#8217;d probably use the natural UTF-8 encoding.  Am I going to disallow using KSC simply because how the algorithm serializes strings is different?  The point here is that defining a serialization algorithm was beyond the scope of what I was trying to do.  </p>
<p>As for copyright, I really hadn&#8217;t thought about it.  I&#8217;ve placed the document itself under a permissive CC license.  The code has the same copyright- just throw in a comment like &#8220;Kid Sister Crypto by Brian Hurt&#8221; and you&#8217;re good to go.  Although this probably isn&#8217;t the code you want to use- I wrote the code in the example explicitly to be easy to understand, not to be fast or small.  There are several obvious optimizations that probably should be made, like inlining the subround function.  The algorithm is public domain- it&#8217;s not patented as far as I know, and as far as I&#8217;m concerned it&#8217;s not <em>patentable</em>.  My whole point was to use well known, well understood, common components and structures.  The only novel idea in the whole work is the problem itself.</p>
<p>If patents or copyrights still worry you, change the algorithm.  Change the constants- which are halfway arbitrary anyways.  Replace the PHT in the key schedule with a rotate, maybe.  Etc.  The main strength of KSC comes from it&#8217;s Feistel Network strucuture- and Feistel Networks come out of the 1960&#8242;s and DES, they&#8217;ve been around since the begining of time (1 Jan 1970).  You&#8217;ll likely end up with an algorithm more or less as good as KSC, but it&#8217;s a different algorithm, and thus not covered by and patents or copyrights on KSC.</p>
]]></content:encoded>
	</item>
</channel>
</rss>

