crypt меня не устроил, слишком калибр большой, для шифрования одного файла.
Пришлось писать самому, вот что за вечер накропал:
// файл krypt.c
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#define BUFSIZE 4096
#define MODE 0644
int in_fd, out_fd, n_chars;
char buf[BUFSIZE];
int crptRnd = 1;
void oops(char*s1, char*s2) { // ошибки ввода-вывода
fprintf(stderr, "ERROR: ", s1);
perror(s2);
exit(1); }
char crptRandom(){ // случайный символ
int x = crptRnd * 0x10450405 >> 15;
crptRnd = x + 1;
return (char)crptRnd; }
void crptBlock() { // шифровать блок
int i;
for (i = 0; i != n_chars; i++) buf = buf ^ crptRandom(); }
int main(int ac, char*av[]) {
int i;
if(ac != 4){ fprintf(stderr,"Usage: password source destination
",*av); exit(1); }
for (i = 0; i < strlen(av[1]); i++) crptRnd += av[1];
if((in_fd=open(av[2],O_RDONLY)) == -1) oops("Cannot open ",av[2]);
if((out_fd=creat(av[3],MODE)) == -1) oops("Cannot create ",av[3]);
while((n_chars=read(in_fd,buf,BUFSIZE))>0) {
crptBlock();
if(write(out_fd,buf,n_chars) != n_chars) oops("Write error to ",av[3]); }
if(n_chars == -1) oops("Read error from",av[2]);
if(close(in_fd) == -1 || close(out_fd) == -1) oops("Еrror closing files"," "); }
Компилируем в терминале: gcc krypt.c -o krypt
Теперь можно шифровать (опять же в терминале):
./krypt <пароль> <имя-файла> <имя-зашифрованного-файла>
В целях предотвращения шифрования нужных данных шифруемый файл сохраняется, удаляем ручками:
rm -f <имя-файла>
Расшифровка в обратном порядке: ./krypt <пароль> <имя-зашифрованного-файла> <имя-файла>
Используйте лучшее!! 
Пользователь решил продолжить мысль 30 Мая 2011, 23:13:06:
Ошибка при копировании произошла

, шифрование блока надо так:
void crptBlock() { // шифровать блок
int i;
for (i = 0; i != n_chars; i++) buf
= buf ^ crptRandom(); }
Пользователь решил продолжить мысль 30 Мая 2011, 23:25:10:
Короче глюк какой-то при копировании через буфер.
В процедуре crptBlock() в цикле for должно быть buf[i-индекс]
Наверно за тэг форматирования принимает. Щаз поправлю:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#define BUFSIZE 4096
#define MODE 0644
int in_fd, out_fd, n_chars;
char buf[BUFSIZE];
int crptRnd = 1;
void oops(char*s1, char*s2) { // ошибки ввода-вывода
fprintf(stderr, "ERROR: ", s1);
perror(s2);
exit(1); }
char crptRandom(){ // случайный символ
int x = crptRnd * 0x10450405 >> 15;
crptRnd = x + 1;
return (char)crptRnd; }
void crptBlock() { // шифровать блок
int ind;
for (ind = 0; ind != n_chars; ind++) buf[ind] = buf[ind] ^ crptRandom(); }
int main(int ac, char*av[]) {
int ind;
if(ac != 4){ fprintf(stderr,"Usage: password source destination\n",*av); exit(1); }
for (ind = 0; ind < strlen(av[1]); ind++) crptRnd += av[1][ind];
if((in_fd=open(av[2],O_RDONLY)) == -1) oops("Cannot open ",av[2]);
if((out_fd=creat(av[3],MODE)) == -1) oops("Cannot create ",av[3]);
while((n_chars=read(in_fd,buf,BUFSIZE))>0) {
crptBlock();
if(write(out_fd,buf,n_chars) != n_chars) oops("Write error to ",av[3]); }
if(n_chars == -1) oops("Read error from",av[2]);
if(close(in_fd) == -1 || close(out_fd) == -1) oops("Еrror closing files"," "); }
// конец krypt.c
Вот теперь все так