old-www/LDP/LG/issue46/serrao.html

668 lines
30 KiB
HTML

<!--startcut BEGIN header ==============================================-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML><HEAD>
<title>Using Java and Linux to crack the DES challenge LG #46</title>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#0000AF"
ALINK="#FF0000">
<!--endcut ============================================================-->
<H4>
"Linux Gazette...<I>making Linux just a little more fun!</I>"
</H4>
<P> <HR> <P>
<!--===================================================================-->
<center>
<H1><font color="maroon">Using Java and Linux to crack the DES challenge</font></H1>
<H4>By <a href="mailto:carlos.serrao@adetti.iscte.pt">Carlos Serrao</a></H4>
</center>
<P> <HR> <P>
<!-- END header -->
<H3>Abstract</H3>
<P> DES has been used for a long time to guarantee the privacy of
transactions in open communication environments, especially in
inter-banking and financial ones. Nevertheless, the security level offered by
this algorithm is not the same that was before. The DES working conditions have
been shifting with the exponential growth of the Internet, and what was
considered as being safe a decade ago is not safe anymore. What this article
intends to show is how weak the actual DES strength is, and how and what a
determined attacker can do to break it using the new Java programming language
and the Linux operating system.
<H3>1. Introduction</H3>
<P> Cryptography has always been used as an effective way for protecting
sensitive information from non-authorised and curious eyes. Cryptography had
its exponential growth with the Second World War. Both the Allies and the Nazis
and the Japanese used this technology successfully. Basically, cryptography is
the process that allows maintaining private communications. There are two main
issues in cryptography: encryption and decryption. Both encryption and
decryption are two of the issues in cryptography, but not the only. Issues like
digital signatures and digital certificates are equally important. Nowadays,
two different kinds of cryptography are used: secret key or symmetric
cryptography and public key or asymmetric cryptography. The major difference
between them is the key usage. In the first one, only one key is used both for
encryption and decryption, and in the second one, two different keys are used,
one for encryption and the other for decryption. Normally, the public key is
freely distributed, while the private key is kept secret. All the public key
system security lies on the secrecy of the private key. In this article, our
attention will be mainly focused on the first case, the secret key
cryptography. DES is just one of the algorithms that uses secret key
cryptography. Others, like IDEA (International Data Encryption Algorithm), RC2
(Ron's Code 2) or RC5 (Ron's Code 5) also use it. DES (Data Encryption
Standard) is a block cipher algorithm that was defined and adopted by the US
government in 1977 as an official standard. It was originally developed by IBM
in 1970 under the name of LUCIFER, and was rapidly adopted as the most used
cryptographic system in the world [1]. Banks and financial institutions mainly
use DES.
<H3>2. Attacks on cryptography</H3>
<P> The main goal of cryptography is to maintain all the information secret
from non-authorised people. Cryptanalysis is a subtopic of Cryptography that
tries to break the secrecy (find the original text from a given encrypted text
without knowing the key used for its encryption). A successful cryptanalysis
can find both the original text and the used key. There are several methods
for performing attacks to these algorithms. The success or failure of each of
the attacking methods is strongly related to the amount of information the
attacker can obtain from both the ciphertext and plaintext [2]. Some of the
most used attacking methods are:
<UL>
<LI> Cyphertext only attack: the cryptanalist only has one or several
encrypted text samples using the same key, and tries to find out the plaintext
and key used.
<LI> Known plaintext attack: in this case, both the ciphertext and the
plaintext of one or several messages are available for the crytanalist.
<LI> Choosen plaintext attack: it's quite similar to the one before.
However in this case, the cryptanalist can choose the plaintext that he wishes
to see encrypted.
<LI> Adaptative chosen plaintext attack: similar to the method
presented before. However, the cryptanalist is able to choose the subsequent
texts according to a previously selected cyphertext / plaintext pair.
<LI> Chosen ciphertext attack: for a symmetric cipher it's similar to
the chosen plaintext attack. For asymmetric ciphers, the cryptanalist can
choose the ciphertext to be decrypted.
<LI> Chosen key or brute force attack: consists in the exhaustive
search of of all the possible keys, decrypting the ciphertext with each one of
the keys and trying to obtain a intelligible result.
</UL>
<H3>3. Key robustness</H3>
<P> The issue of key robustness has always been highly discussed. The bigger
the cryptographic key is, the stronger is the ciphertext generated. However, if
the cryptographic key is big, the cryptographic system is also more demanding
in terms of processing power.
<PRE>
+------------+-----------------------------------+
| Year | Millions of Encryption per Second |
+------------+-----------------------------------+
| 1995 | 4 |
+------------+-----------------------------------+
| 2000 | 32 |
+------------+-----------------------------------+
| 2005 | 256 |
+------------+-----------------------------------+
+------------+--------------+--------------+--------------+
| Key size | 1995 | 2000 | 2005 |
+------------+--------------+--------------+--------------+
| 40 bits | 68 seconds | 8,6 seconds | 1,07 seconds |
+------------+--------------+--------------+--------------+
| 56 bits | 7,4 weeks | 6,5 days | 19 hours |
+------------+--------------+--------------+--------------+
| 64 bits | 36,7 years | 4,6 years | 6,9 months |
+------------+--------------+--------------+--------------+
| 128 bits | 6,7e17 Myears| 8,4e16 Myears|1,1e16 Myears |
+------------+--------------+--------------+--------------+
Table 1 - Key robustness computation based on key size and on hardware
with 4000 dedicated chips. Source: Department of Computer Science,
University of Bristol, 1996
+------------+-----------------------------------+
| Year | Millions of Encryption per Second |
+------------+-----------------------------------+
| 1995 | 50 |
+------------+-----------------------------------+
| 2000 | 400 |
+------------+-----------------------------------+
| 2005 | 3200 |
+------------+-----------------------------------+
+------------+--------------+--------------+--------------+
| Key size | 1995 | 2000 | 2005 |
+------------+--------------+--------------+--------------+
| 40 bits | 1,3 days | 3,8 hours | 28,6 minutes|
+------------+--------------+--------------+--------------+
| 56 bits | 228 years | 28,6 years | 3,6 years |
+------------+--------------+--------------+--------------+
| 64 bits | 58,5 Myears | 7,3 Myears | 914 years |
+------------+--------------+--------------+--------------+
| 128 bits | 1,1e12 Myears| 1,3e30 Myears| 1,7e19 Myears|
+------------+--------------+--------------+--------------+
Table 2 - Key robustness computation based on key size and on 200
dedicated PCs. Source: Department of Computer Science, University of
Bristol, 1996
</PRE>
<P> The robustness of the keys highly depends on the available processing
capacity. With a bigger processing power, less will be the necessary time to
crack a cryptographic. On the other end, if the processing power increases also
does the key size and consequently the robustness of cryptographic algorithms.
But, what seems clear, is that keys that were considered has being safe two or
three years ago, are not safe at all now.
<H3>4 DES - Data Encryption Standard</H3>
<P> In 1972, the National Bureau of Standards (now, known as NIST) had launched
a request to the scientific community to conceive a new cryptographic
algorithm. This new algorithm should have the following characteristics:
<OL>
<LI> High level of security
<LI> Completely specified and easy to understand
<LI> Available to everyone
<LI> Adaptable
<LI> Efficient enough to implement in a computer.
</OL>
<P> In 1974, IBM answered this request with an algorithm named LUCIFER (later
it was called DEA - Data Encryption Algorithm or DES). Finally, in 1976 DES was
adopted as a standard in US.
<P> DES has kept itself, until now, for twenty years as an international
standard. Although DES is finally showing some signs of its age, is still
considered as one of the strongest and efficient algorithms in the world.
<H3>4.1. How DES works</H3>
<P> DES is a block cipher. It encrypts 64 bits blocks each time. A set of 64
bits of plaintext enters the algorithm and a set of 64 bits of ciphertext comes
out of the algorithm.
<P> DES is a symmetric key algorithm and uses the same key for encryption and
decryption processes. The keysize is 56 bits. DES uses a 56 bit key (the key is
normally represented by 64 bits, and every eight bit is used just for parity
checking).
<P> At its simplest level, the algorithm is based on two simple principles:
diffusion and confusion. DES applies substitutions followed by permutations to
a plaintext, based on a given key. This process is called round, and DES
applies it 16 times. The following scheme represents a more detailed look of
DES.
<CENTER>
<IMG SRC=gx/serrao/image01.jpg WIDTH=389 HEIGHT=710><BR CLEAR=all>
Figure 1 - A detailed scheme showing how DES works
</CENTER>
<P> A more detailed explanation is outside the scope of this article. More
information can be found on any good book about cryptography.
<H3>5. RSA Labs Cryptographic challenges</H3>
<P> The RSA Laboratories Data Security Division promotes and maintains a set of
cryptographic challenges as research tools [3]. Some of the challenges that
presently RSA holds, are:
<OL>
<LI> RSA factoring challenge
<LI> Secret-key challenge
<LI> DES challenge
</OL>
<H3>5.1. DES challenge</H3>
<P> The original DES challenge was launched in January 1997, with the aim of
demonstrating that 56-bit security, such as that offered by the US government's
DES, offers only marginal protection against a committed adversary. This was
confirmed when the secret key used for encryption was recovered on June 17,
1997. Since then it has been widely acknowledge that much faster exhaustive
search efforts are possible and DES challenge II is intended to show how fast.
<P> While the original showed DES was crackable using an exhaustive search
attack, the goal of the new DES challenge is to see how quickly an exhaustive
search attack can be accomplished to help judge the true vulnerability of DES.
<P> Twice a year, on January 13 and July 13, at 9:00 AM Pacific Time, a new
contest will be posted on the RSA homepage. The contest will consist of the
ciphertext produced by DES-encrypting some unknown plaintext message that has a
fixed and known message header. The first to recover the key wins, and the
amount of the prize will depend on how fast the key was recovered.
<H3>5.2. DES challenge details</H3>
<P> For each contest, the unknown message will be preceded by three known
blocks of text containing the 24-character phrase: ``The unknown message is:``.
While the mystery text that follows will clearly be known to a few employees of
the RSA Data Security, the secret key actually used for the encryption will be
generated at random and destroyed within the challenge-generating software. The
key will never be revealed to anyone.
<P> The goal of each contest is for participants to recover the secret randomly
generated key that was used on the encryption in a faster time than that
required for earlier challenges in the series.
<H3>6. Breaking DES</H3>
<P> Many problems require a large amount of computational power to reach to a
solution. Some problems, though, are amenable to an extremely high level of
parallelization, and with today's Internet it is possible to broaden the reach
of any large-scale effort to previously unanticipated levels.
<P> Breaking DES is one of these problems. It is necessary to use a somewhat
large computational power. Even if we consider a 56-bit key it is very
difficult and hard task to perform.
<P> The "best" strategy to break DES is to perform a brute force attack. This
means having to test all the possible keys and analyse and compare the results.
If we consider a 56-bit key, meaning that we will have approximately 256
possible combinations. Even with today common computational power this takes a
while.
<P> Breaking DES is clearly a NP-complete problem. It is impossible to find a
solution to a NP-complete problem in polynomial time, but given a
solution, it is possible to check whether it is valid or not. Typically, all
cryptographic problems are NP-complete problems.
<H3>7. General architecture</H3>
<P> The first aspect to consider when planning a general architecture for
breaking DES is to choose between a hardware or software attack.
<P> DES can be very easily implemented on a hardware chip, and lots of these
chips can be used for breaking DES. One of the most obvious advantages of this
approach is the resulting processing power. On the other hand, one of the
problems arising from this architecture is its large cost.
<P> Another possible approach for a general architecture is to use a software
attack. One of the problems with this kind of architecture is the processing
power. If only one computer is used the processing power obtained is quite
disappointing. This type of attack is very easy to implement and is also less
expensive than the previous one.
<P> However, more interesting results can be achieved when using a distributed
computing attack, based on the computational power increase obtained by joining
the computing power of several computers.
<H3>8. Distributed computing</H3>
<P> Distributed computing can be easily described as the effort to unify
multiple networked machines in such a way that information or other resources
can be shared by all of these connected computers. The hope is that sharing can
take place over large areas, many machines, and many users, unifying them in a
consistent and coherent framework.
<P> Distributed computing became a field of study when computer hardware
evolved from the mainframe, where everyone shared all the resources of a single
machine, to the minicomputer. The minicomputer made it necessary for two people
(or programs) to work together or share resources when they were on different
machines. Co-ordinating that work, or providing access to those resources, is
the goal of distributed computing.
<P> Interest in distributed computing has increased with the advent of
individual workstations and networked PCs, mainly with the spread of the
Internet. Because these are single user machines, the need to share
information, computing resources or data resources became immediate as soon as
there was any joint work to be done.
<H3>9. Specific architecture</H3>
<P> As it was stated before, one of the possible ways for building an
architecture to break DES is through a distributed computing architecture.
<P> However, some considerations should be take into account. For instance,
what is the best configuration and which are its constraints.
<P> No doubt that, in order to profit the availability of Internet's computing
power the best solution is to implement typical client-server architecture. A
server for distributing the keys and the clients to do the hard work: test all
the keys and check the result.
<CENTER>
<IMG SRC=gx/serrao/image02.jpg WIDTH=594 HEIGHT=674><BR CLEAR=all>
Figure 2 - Overview of the distributed architecture
</CENTER>
<H3>9.1. Considerations</H3>
<P> There are different approaches to an exhaustive search. The major
consideration is whether the search is co-ordinated by some central server, or
whether multiple processes start at random positions in the search space and
run independently until a key is found.
<P> The use of a central server poses some difficulties. As well as providing a
single point of failure, there is also the potential of network congestion and
failures.
<P> A variety of precautions should be taken in account. Servers can be
networked into a hierarchy, or replicated if resources allow, so that points of
failure are less catastrophic. In addition, clients can test themselves to
provide some level of assurance against malfunction and servers to provide
assurance against malevolent clients can conduct more explicit testing on the
clients. The server can have the client report on server-fabricated problems
that can be checked at very low cost. Alternatively a client could calculate a
checksum over all attempted solutions in the range examined and another client
of the same architecture could check this.
<H3>9.2. Functionality</H3>
<P> Although the client-server architecture presents some problems, it is still
the easiest and cheapest one to implement and maintain.
<P> The basic idea is to have a central server, that is in charge of performing
simple tasks, like adding new clients to the contest, distribute new groups of
keys and verify and update the results.
<P> The server itself does only the easy work on the system. The hard work,
trying all the possible keys and check the result, is done by the set of
clients. The more clients the system has, the faster will be coverage of all
the key-space.
<P> The functionality of the server can be easily summarised in the following
scheme.
<CENTER>
<IMG SRC=gx/serrao/image03.jpg><BR CLEAR=all>
Figure 3 - DES key server functionality
</CENTER>
<P> The functionality of the client can also be summarized this way:
<P> Basically, the main functionality of the client software is to test all the
possible keys distributed by the key server and then analyse the result and
test if the key is the right key or not.
<P> If it is the right key the client key the client communicates with the
server and sends a remark to the server stating that has found the key.
<CENTER>
<IMG SRC=gx/serrao/image04.jpg><BR CLEAR=all>
Figure 4 - DES key client functionality
</CENTER>
<H3>10. Implementation</H3>
<P> No doubt subsists that the best possible architecture for facing the DES
challenge is to use a client-server distributed architecture over the Internet.
<P> In order to implement such architecture, some important decisions have to
be made, like choosing the best deployment platforms and the right tools.
<H3>10.1. Linux</H3>
<P> Linux is a Posix Compliant operating system designed to run on the Intel
architecture. The system also has extensions to accommodate System V and BSD
requirements.
<P> This OS is licensed under the GNU Public license and is as such, freely
distributable provided the source accompanies the distribution or is at least
made available to the recipient.
<P> Linux runs on Intel processors 386 and later that are capable of utilising
the 386 protected mode.
<P> For a strictly minimum implementation you can expect to need about 10-15
Megabytes of disk space and 8 Meg of RAM. It is possible to run it in 4 Meg,
but consider 8 a reasonable minimum for text based installation. In order to
utilise X (the Unix windowing system) with any reasonable efficiency, expect to
need about 16 Meg of RAM as a reasonable minimum (300M hardfile space).
<P> The system is currently capable of compiling and running Posix compliant
Unix programs, as well as Dos programs through the use of DosEmu. Windows
applications have limited success running on Linux through the use of Wine (a
windows emulator).
<P> Although Linux is usually referred to in conjunction with 386/486/Pentium
machines, it also runs on, or is currently being ported to, other architectures
(eg DEC Alpha, Sun SPARC, MIPS, PowerPC, and PowerMAC).
<H3>10.2. Java</H3>
<P> Java is an object oriented programming language developed by Sun
Microsystems, and now further developed by its JavaSoft subsidiary.
<P> At first glance it resembles C and C++, but it's different under the hood.
Java is both a compiled and an interpreted language. Its source code is
compiled into a universal form - bytecodes for a virtual machine - that can
easily be ported across the Internet and interpreted and run on many platforms.
<P> Compared to other programming languages Java is much simpler, robust, and
cost-effective. It allows an application to be developed with a minimum of
debugging and is instantly portable to many operating systems. Compared to
other Internet solutions, Java offers unmatched performance and versatility
while minimising the strain on the web servers by distributing the processing
load to the client machines.
<P> Java possesses also a series of additional APIs that allow the fast
development of complex applications. Such APIs include for instance Networking,
Distributed Method Communication, Database Connectivity and Cryptographic
support.
<H3>10.2.1. Java RMI</H3>
<P> Java RMI (Remote Method Invocation) technology is the basis for distributed
computing in the Java environment. Because Java RMI was created after broad
acceptance of the Internet and object oriented design, developers are treated
to a dynamic and flexible environment for building distributed applications.
</CENTER>
<IMG SRC=gx/serrao/image05.jpg><BR CLEAR=all>
Figure 5 - The behaviour of Java RMI technology in a distributed
application
</CENTER>
<P> Because of Java RMI technology, developers can now:
<OL>
<LI> Easily create powerful distributed computer applications and
network services for Java and non-Java environments
<LI> Use Java RMI, a single programming interface, for object
communication in distributed applications.
</OL>
<H3>10.2.2. JDBC</H3>
<P> JDBC (Java Database Connectivity) is an application program interface (API)
specification for connecting programs written in Java to the data in popular
databases. The application program interface lets you encode access request
statements in structured query language (SQL) that are then passed to the
program that manages the database. It returns the results through a similar
interface. JDBC is very similar to Microsoft's Open Database Connectivity
(ODBC) and, with a small "bridge" program, you can use the JDBC interface to
access databases through Microsoft's ODBC interface. For example, you could
write a program designed to access many popular database products on a number
of operating system platforms. When accessing a database on a PC running
Microsoft's Windows 95 and, for example, a Microsoft Access database, your
program with JDBC statements would be able to access the Microsoft Access
database.
<P> JDBC actually has two levels of interface. In addition to the main
interface, there is also an API from a JDBC "manager" that in turn communicates
with individual database product "drivers", the JDBC-ODBC bridge if necessary,
and a JDBC network driver when the Java program is running in a network
environment (that is, accessing a remote database).
<P> When accessing a remote database, JDBC takes advantage of the Internet's
file addressing scheme and a file name looks much like a Web page address (or
URL). For example, a Java SQL statement might identify the database as:
<PRE>
jdbc:odbc://www.somecompany.com:400/databasefile
</PRE>
<P> JDBC specifies a set of object-orient programming classes for the
programmer to use in building SQL requests. An additional set of classes
describes the JDBC driver API. The most common SQL data types, mapped to Java
data types, and are supported. The API provides for implementation-specific
support for transactional requests and the ability to commit or roll back to
the beginning of a transaction.
<H3>10.2.3. JCE</H3>
<P> The Java Cryptography Extension (JCE) extends the Java Cryptography
Architecture (JCA) API about additional features for supporting encryption and
key exchange.
<P> The Java Cryptography Extension (JCE) is a set of APIs and implementations
of cryptographic functionality, including symmetric, asymmetric, stream, and
block encryption. It supplements the security functionality of the default Java
JDK 1.1.x / JDK 1.2, which itself includes digital signatures (DSA) and message
digests (MD5, SHA).
<P> The architecture of the JCE follows the same design principles found
elsewhere in the JCA.
<H3>10.2.4. PostgreSQL</H3>
<P> Traditional relational database management systems (DBMSs) support a data
model consisting of a collection of named relations, containing attributes of a
specific type.
<P> In current commercial systems, possible types include floating point
numbers, integers, character strings, money, and dates. It is commonly
recognised that this model is inadequate for future data processing
applications. The relational model successfully replaced previous models in
part because of its "Spartan simplicity". However, as mentioned, this
simplicity often makes the implementation of certain applications very
difficult. Postgres offers substantial additional power by incorporating the
following four additional basic concepts in such a way that users can easily
extend the system:
<UL>
<LI> classes
<LI> inheritance
<LI> types
<LI> functions
</UL>
Other features provide additional power and flexibility:
<OL>
<LI> constraints
<LI> triggers
<LI> rules
<LI> transaction integrity
</OL>
<P> These features put Postgres into the category of databases referred to as
object-relational. Note that this is distinct from those referred too as
object-oriented, which in general are not as well suited to supporting the
traditional relational database languages. So, although Postgres has some
object-oriented features, it is firmly in the relational database world. In
fact, some commercial databases have recently incorporated features pioneered
by Postgres.
<P> PostgreSQL is then a sophisticated Object-Relational DBMS, supporting
almost all SQL constructs, including transactions, sub-selects and user-defined
types and functions. It is the most advanced open-source database available
anywhere.
<H3>10.3. Putting everything together</H3>
<P> Now, after having in mind the tools and what architecture to use, it is
necessary to put everything together.
<P> The chosen development platform is Linux, because of its characteristics as
a good development system. The language to be used is Java, because of its
easiness.
<P> On the server side, one of the most important things to be defined is the
server database. This database is quite important since it will store important
information about the contest, like detailed information about the contest
clients, the set of keys that each client is currently processing, which was
the last key to be issued among other things.
<P> The database will be developed using a free object-relational database
called Postgresql. The server software, totally developed on Java, will
interface with the database through the JDBC API.
<CENTER>
<IMG SRC=gx/serrao/image06.jpg><BR CLEAR=all>
Figure 6 - Client-Server final architecture configuration
</CENTER>
<P> One of the main functions of a server is to wait and receive requests from
a client. The DES key server has the same behaviour. The server starts, waits
and processes requests. In order to communicate with the clients it is
necessary to have some network functionality's. In this case, the server
receives requests from the clients through RMI. RMI was chosen, because it adds
a layer of abstraction between the Java program and the network complexities.
<P> On the client side, one of the most important things to be implemented is
the cryptographic functionality. The client software should be capable of use
and process DES algorithm. Since the client software will know part of the
plaintext and the full secret message, it has to be capable of trying to
decrypt the secret message using a key supplied by the server and compare the
result with the partial plaintext.
<P> As it is in the server, this client software is totally implemented in
Java. This allows that a larger number of different computers and platforms to
join rapidly to the contest, enlarging considerably the computational power to
find as quickly as possible a solution for the proposed problem - find the
correct DES key.
<H3>11. Conclusion</H3>
<P> DES 56-bit is not safe anymore. It is clear that with today's computing
power, and with increasing network capabilities, like Internet, it is easy to
set-up an architecture for cracking a DES key.
<P> Linux and Java, are two of the tools that allow the easy creation of such
architectures and make it available to almost everyone. Linux, because it is a
simple, fast, powerful and free operating system that allows the building of
power server capabilities. Java, because it is easy to learn and architecture
independent allowing a fast development for a large number of different
platforms.
<H3>References</H3>
<P> [1] RSA Laboratories - Cryptographic Research and Consultation, "Answers to
Frequently Asked Questions About Today's Cryptography - Version 3.0", RSA Data
Security, 1996
<P> [2] Schneier, Bruce, "Applied Cryptography - Protocols, Algorithms and
Source code in C", John Wiley &amp; sons, Inc., 1996
<P> [3] "DES Challenge II", RSA Laboratories, RSA Data Security,
<A HREF=http://www.rsa.com/rsalabs/des2>http://www.rsa.com/rsalabs/des2</A>,
1997
<!-- BEGIN copyright ==================================================-->
<P> <hr> <P>
<H5 ALIGN=center>
Copyright &copy; 1999, Carlos Serrao <BR>
Published in Issue 46 of <i>Linux Gazette</i>, October 1999</H5>
<!-- END copyright ===================================================-->
<!--startcut footer ===================================================-->
<P> <hr> <P>
<A HREF="index.html"><IMG ALIGN=BOTTOM SRC="../gx/indexnew.gif"
ALT="[ TABLE OF CONTENTS ]"></A>
<A HREF="../index.html"><IMG ALIGN=BOTTOM SRC="../gx/homenew.gif"
ALT="[ FRONT PAGE ]"></A>
<A HREF="pollman.html"><IMG SRC="../gx/back2.gif"
ALT=" Back "></A>
<A HREF="../faq/index.html"
><IMG SRC="./../gx/dennis/faq.gif"
ALT="[ Linux Gazette FAQ ]"></A>
<A HREF="skjoldebrand.html"><IMG SRC="../gx/fwd.gif" ALT=" Next "></A>
<P> <hr> <P>
</BODY></HTML>
<!--endcut ============================================================-->