Showing posts with label privacy. Show all posts
Showing posts with label privacy. Show all posts

Sunday, 8 December 2013

How to write a virus

Question

How do I create a computer virus?

Answer

If you are interested in creating a computer virus, Trojan, worm, malware, or other malicious program as revenge, payback, or as a prank we suggest you rethink. Creating a virus that deletes files or causes other issues resolves nothing and will result in prosecution by the law. In other words, you could be fined or sent to prison.
Instead of creating computer viruses or other malware consider learning a computer programming language. You'll learn a lot more by learning one or more programming languages and become more qualified in getting hired at a company that designs programs or analyzes viruses. No one ever got hired because they wrote a computer virus.

Below is additional questions and answers that relate to this same subject.

I only want to write a virus to learn how they work.

You will learn a lot more about how computer programs and viruses work by learning to program than you ever will by writing and tinkering with computer viruses. A computer virus is only a program designed to do malicious tasks on the computer such as deleting files, inserting its code into other files, and copying itself to other places and computers accessible to the computer that is running the virus. By learning to program, you'll not only know how these tasks are possible, but also learn much more.

I need to test my virus scanner.

You can create test virus files that can be used to test your computers anti-virus scanner without having to create your own virus. See the below link for additional information and code on how to create a test virus.

If I create a good computer virus, I will be famous.

No, the only fame you may get is a brief news article or a picture of you being handcuffed and sent to prison. Once incarcerated it will go on your record and make it next to impossible to get hired at any respectable computer company and impossible to get hired by any government agency.

If you were to write a computer virus that was successful you would want to remain anonymous in fear of being prosecuted by the law. Also, if you think about it, almost everyone knows who is and what he has done for computers but have no clue about .

If I write a good virus, I'll get hired at a security firm or antivirus company.

False, no respectable security firm or antivirus company wants to affiliated with a virus or malware creator that infected potential customer computers. If you're interested in getting a job with a security firm or antivirus company you'll have a much better chance by learning to programming, becoming a participant in security discussions, being a beta tester, or finding vulnerabilities in programs and reporting them to the developers. Companies such as Google will even pay good money to anyone who reports bugs or security vulnerabilities about any of their products.

Can Computer Hope send me additional details, examples, or other information about creating viruses?

No, Computer Hope will not send anyone any other additional information about creating computer viruses, worms, or Trojans. This document was only created to help deter people from creating computer viruses and learn computer programming instead.

What programming languages should I learn?

Programming language such as C, C++, C#, Java, Perl, PHP, and Python are all good programming languages for new computer programmers. See the below link if you're not exactly sure what language to start learning first.

Fundamental of computer programming


Fundamental of Computer Programming

Objective

Functions, Pointers

Functions:
A function is a self-contained block of statements that perform a task of some kind.
Arguments are passed to the function, the function performs a task using the arguments, and the function returns a value back to the main program. Functions break a program into multiple parts, with each part performing a specific task.

Parts of a Function
The program multiplies two integers. Although multiplying two integers in C is very easy, a function is used here to demonstrate their use with a simple code example. The different parts of a function are commented.

Code Example:

#include <stdio.h>
#include<conio.h>
int mult(int n1, int n2);            // function declaration (function prototype)
int main()
{
int a,b,output;
printf("Enter integer a: ");
scanf("%d",&a);
printf("Enter integer b: ");
scanf("%d",&b);
output = mult(a,b);     //  function call
printf("a*b = %d\n",output);
getch();
return 0;
}

int mult(int n1, int n2)     // function definition
{
    int result;
    result=n1*n2; 
    return result;    // function return value
}

Declaration:
The function declaration informs the compiler about relevant properties of the function (much like a variable declaration). The declaration includes the type of value it returns (such as int or float), the function name, and a list of input parameters it expects.
It is possible for a function to not return a value. Such a function must use the "void" type. In a void function, the "return" statement is optional.
void message( );   //function declaration which return no value and takes no parameters
Call:
The function call is where the main ( ) calls the mult function. The variable input is passed to the function. Note that input is an int, which is what mult was expecting (as seen in the function declaration). The main ( ) becomes the “calling” function and mult becomes the “called” function.

Definition:
This is where the actual code for the function is located. Note that the first line in the definition of function matches the function declaration except for the semicolon.

Return Value:
This is the result that is passed back to the caller function. The return value must have the same type as the function; in this case the function mult has type int, so the return value must be of type int.

Pointers:
‘&’ is called address operator. Pointer operator available in C is “*”, called ‘value at address’ operator. It gives the value stored at a particular address. The “value at address” operator is also called “indirection” operator.
int main( )
{
int i = 3 ;
printf ( "\nAddress of i = %u", &i ) ;
printf ( "\nValue of i = %d", i ) ;
printf ( "\nValue of i = %d", *( &i ) ) ;
getch( );
return 0;
}
The output of the above program would be:
Address of i = 65524
Value of i = 3
Value of i = 3
Note that printing the value of *(&i) is same as printing the value of i.
The expression &i gives the address of the variable i. This address can be collected in a variable, by saying,
int *j;
j = &i ;
But remember that j is not an ordinary variable like any other integer variable. It is a variable that contains the address of other variable (i in this case). Since j is a variable the compiler must provide it space in the memory.
Pass by reference and pass by value
Whenever we called a function and passed something to it we have always passed the ‘values’ of variables to the called function. Such function calls are called ‘calls by value’. By this we mean is, on calling a function we are passing values of variables to it. The examples of call by value are shown below:
sum = calsum ( a, b, c ) ;

Instead of passing the value of a variable, pass the location number (also called address) of the variable to a function. Such functions calls are called ‘call by reference’.

Code Example:

//Call by value
void swapv(int x , int y);
int main( )
{
int a = 10, b = 20 ;
swapv ( a, b ) ;
printf ( "\na = %d b = %d", a, b ) ;
getch( );
return 0;
}

void swapv ( int x, int y )
{
int t ;
t = x ;
x = y ;
y = t ;
printf ( "\nx = %d y = %d", x, y ) ;
}
The output of the above program would be:
x = 20 y = 10
a = 10 b = 20
Note that values of a and b remain unchanged even after exchanging the values of x and y.
//call by reference
       void swapv(int x , int y);
int main( )
{
int a = 10, b = 20 ;
swapr ( &a, &b ) ;
printf ( "\na = %d b = %d", a, b ) ;
getch( );
return 0;
}
swapr( int *x, int *y )
{
int t ;
t = *x ;
*x = *y ;
*y = t ;
}
The output of the above program would be:
a = 20 b = 10
Note that this program manages to exchange the values of a and b using their addresses stored in x and y.



TASKS:

Write a function to calculate the factorial value of any integer entered through keyboard. Function receive integer value in main ( ) and prints results in function.


Create a simple calculator using functions. Write separate functions for addition, multiplication, subtraction, division, modulus and power function. Each function takes three arguments, two of the arguments are integers and third argument is an integer pointer argument which stores the result of operation on first two arguments. Each function declaration and definition contain return-type void.

Game in c language code

Mini project snake game in c

codeblock

#include <stdio.h>
#include <time.h>

#include <stdlib.h>

#include <conio.h>

#include<time.h>

#include<ctype.h>

#include <time.h>

#include <windows.h>

#include <process.h>

#define UP 72

#define DOWN 80

#define LEFT 75

#define RIGHT 77

int length;

int bend_no;

int len;

char key;

void record();

void load();

int life;

void Delay(long double);

void Move();

void gotoxy(int x, int y);

void GotoXY(int x,int y);

void Bend();

void Boarder();

void Down();

void Left();

void Up();

void Right();

void ExitGame();

int Scoreonly();

struct coordinate{

int x;

int y;

int direction;

typedef struct coordinate coordinate;

coordinate head, bend[500],food,body[30];

int main()

char key;

Print();

system("cls");

load();

length=5;

head.x=25;

head.y=20;

head.direction=RIGHT;

Boarder();

Food(); //to generate food coordinates initially

life=3; //number of extra lives

bend[0]=head;

Move(); //initialing initial bend coordinate

return 0;

void Move()

int a,i;

do{

Food();

fflush(stdin);

len=0;

for(i=0;i<30;i++)

body[i].x=0;

body[i].y=0;

if(i==length)

break;

Delay(length);

Boarder();

if(head.direction==RIGHT)

Right();

else if(head.direction==LEFT)

Left();

else if(head.direction==DOWN)

Down();

else if(head.direction==UP)

Up();

ExitGame();

}while(!kbhit());

a=getch();

if(a==27)

system("cls");

exit(0);

key=getch();

if((key==RIGHT&&head.direction!=LEFT&&head.direction!=RIGHT)||(key==LEFT&&head.direction!=RIGHT&&head.direction!=LEFT)||(key==UP&&head.direction!=DOWN&&head.direction!=UP)||(key==DOWN&&head.direction!=UP&&head.direction!=DOWN))

bend_no++;

bend[bend_no]=head;

head.direction=key;

if(key==UP)

head.y--;

if(key==DOWN)

head.y++;

if(key==RIGHT)

head.x++;

if(key==LEFT)

head.x--;

Move();

else if(key==27)

system("cls");

exit(0);

else

printf("\a");

Move();

void gotoxy(int x, int y)

COORD coord;

coord.X = x;

coord.Y = y;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);

void GotoXY(int x, int y)

HANDLE a;

COORD b;

fflush(stdout);

b.X = x;

b.Y = y;

a = GetStdHandle(STD_OUTPUT_HANDLE);

SetConsoleCursorPosition(a,b);

void load(){

int row,col,r,c,q;

gotoxy(36,14);

printf("loading...");

gotoxy(30,15);

for(r=1;r<=20;r++){

for(q=0;q<=100000000;q++);//to display the character slowly

printf("%c",177);}

getch();

void Down()

int i;

for(i=0;i<=(head.y-bend[bend_no].y)&&len<length;i++)

GotoXY(head.x,head.y-i);

if(len==0)

printf("v");

else

printf("*");

body[len].x=head.x;

body[len].y=head.y-i;

len++;

Bend();

if(!kbhit())

head.y++;

void Delay(long double k)

Score();

long double i;

for(i=0;i<=(10000000);i++);

void ExitGame()

int i,check=0;

for(i=4;i<length;i++) //starts with 4 because it needs minimum 4 element to touch its own body

if(body[0].x==body[i].x&&body[0].y==body[i].y)

check++; //check's value increases as the coordinates of head is equal to any other body coordinate

if(i==length||check!=0)

break;

if(head.x<=10||head.x>=70||head.y<=10||head.y>=30||check!=0)

life--;

if(life>=0)

head.x=25;

head.y=20;

bend_no=0;

head.direction=RIGHT;

Move();

else

system("cls");

printf("All lives completed\nBetter Luck Next Time!!!\nPress any key to quit the game\n");

record();

exit(0);

void Food()

if(head.x==food.x&&head.y==food.y)

length++;

time_t a;

a=time(0);

srand(a);

food.x=rand()%70;

if(food.x<=10)

food.x+=11;

food.y=rand()%30;

if(food.y<=10)

food.y+=11;

else if(food.x==0)/*to create food for the first time coz global variable are initialized with 0*/

food.x=rand()%70;

if(food.x<=10)

food.x+=11;

food.y=rand()%30;

if(food.y<=10)

food.y+=11;

void Left()

int i;

for(i=0;i<=(bend[bend_no].x-head.x)&&len<length;i++)

GotoXY((head.x+i),head.y);

if(len==0)

printf("<");

else

printf("*");

body[len].x=head.x+i;

body[len].y=head.y;

len++;

Bend();

if(!kbhit())

head.x--;

void Right()

int i;

for(i=0;i<=(head.x-bend[bend_no].x)&&len<length;i++)

//GotoXY((head.x-i),head.y);

body[len].x=head.x-i;

body[len].y=head.y;

GotoXY(body[len].x,body[len].y);

if(len==0)

printf(">");

else

printf("*");

/*body[len].x=head.x-i;

body[len].y=head.y;*/

len++;

Bend();

if(!kbhit())

head.x++;

void Bend()

int i,j,diff;

for(i=bend_no;i>=0&&len<length;i--)

if(bend[i].x==bend[i-1].x)

diff=bend[i].y-bend[i-1].y;

if(diff<0)

for(j=1;j<=(-diff);j++)

body[len].x=bend[i].x;

body[len].y=bend[i].y+j;

GotoXY(body[len].x,body[len].y);

printf("*");

len++;

if(len==length)

break;

else if(diff>0)

for(j=1;j<=diff;j++)

/*GotoXY(bend[i].x,(bend[i].y-j));

printf("*");*/

body[len].x=bend[i].x;

body[len].y=bend[i].y-j;

GotoXY(body[len].x,body[len].y);

printf("*");

len++;

if(len==length)

break;

else if(bend[i].y==bend[i-1].y)

diff=bend[i].x-bend[i-1].x;

if(diff<0)

for(j=1;j<=(-diff)&&len<length;j++)

/*GotoXY((bend[i].x+j),bend[i].y);

printf("*");*/

body[len].x=bend[i].x+j;

body[len].y=bend[i].y;

GotoXY(body[len].x,body[len].y);

printf("*");

len++;

if(len==length)

break;

else if(diff>0)

for(j=1;j<=diff&&len<length;j++)

/*GotoXY((bend[i].x-j),bend[i].y);

printf("*");*/

body[len].x=bend[i].x-j;

body[len].y=bend[i].y;

GotoXY(body[len].x,body[len].y);

printf("*");

len++;

if(len==length)

break;

void Boarder()

system("cls");

int i;

GotoXY(food.x,food.y); /*displaying food*/

printf("F");

for(i=10;i<71;i++)

GotoXY(i,10);

printf("!");

GotoXY(i,30);

printf("!");

for(i=10;i<31;i++)

GotoXY(10,i);

printf("!");

GotoXY(70,i);

printf("!");

void Print()

//GotoXY(10,12);

printf("\tWelcome to the mini Snake game.(press any key to continue)\n");

getch();

system("cls");

printf("\tGame instructions:\n");

printf("\n-> Use arrow keys to move the snake.\n\n-> You will be provided foods at the several coordinates of the screen which you have to eat. Everytime you eat a food the length of the snake will be increased by 1 element and thus the score.\n\n-> Here you are provided with three lives. Your life will decrease as you hit the wall or snake's body.\n\n-> YOu can pause the game in its middle by pressing any key. To continue the paused game press any other key once again\n\n-> If you want to exit press esc. \n");

printf("\n\nPress any key to play game...");

if(getch()==27)

exit(0);

void record(){

char plname[20],nplname[20],cha,c;

int i,j,px;

FILE *info;

info=fopen("record.txt","a+");

getch();

system("cls");

printf("Enter your name\n");

scanf("%[^\n]",plname);

//************************

for(j=0;plname[j]!='\0';j++){ //to convert the first letter after space to capital

nplname[0]=toupper(plname[0]);

if(plname[j-1]==' '){

nplname[j]=toupper(plname[j]);

nplname[j-1]=plname[j-1];}

else nplname[j]=plname[j];

nplname[j]='\0';

//*****************************

//sdfprintf(info,"\t\t\tPlayers List\n");

fprintf(info,"Player Name :%s\n",nplname);

//for date and time
time_t mytime;

mytime = time(NULL);

fprintf(info,"Played Date:%s",ctime(&mytime));

//**************************

fprintf(info,"Score:%d\n",px=Scoreonly());//call score to display score

//fprintf(info,"\nLevel:%d\n",10);//call level to display level

for(i=0;i<=50;i++)

fprintf(info,"%c",'_');

fprintf(info,"\n");

fclose(info);

printf("wanna see past records press 'y'\n");

cha=getch();

system("cls");

if(cha=='y'){

info=fopen("record.txt","r");

do{

putchar(c=getc(info));

}while(c!=EOF);}

fclose(info);

int Score()

int score;

GotoXY(20,8);

score=length-5;

printf("SCORE : %d",(length-5));

score=length-5;

GotoXY(50,8);

printf("Life : %d",life);

return score;

int Scoreonly()

int score=Score();

system("cls");

return score;

void Up()

int i;

for(i=0;i<=(bend[bend_no].y-head.y)&&len<length;i++)

GotoXY(head.x,head.y+i);

if(len==0)

printf("^");

else

printf("*");

body[len].x=head.x;

body[len].y=head.y+i;

len++;

Bend();

if(!kbhit())

head.y--;

How to multiply faster

Today we're going to kick things off by learning 5 tips that will help you multiply numbers quickly in your head and become the mental math wizard in your family.

Tip #1: Multiplying by Powers of 5
There are times in life when you just get lucky. It turns out that one of those lucky little moments occurs each and every time you need to multiply one number by another number that happens to be a power of 5. For example, let's say you need to find 36 x 5 (which, of course, fits the bill since 5 is the first power of 5). The trick is to recognize the fact that 5 = 10 / 2. Why is that helpful? Because it means that we can find 36 x 5 by instead finding 36 x 10 (which is easy) and then dividing the result by 2. In this case, 36 x 10 = 360, and 360 / 2 = 180. Impressively speedy, right?

But we're not done! What if we instead need to solve the problem 36 x 25? Well, this trick is all about multiplying by powers of 5…and 25 = 5^2 is certainly that. So how does it work in this case? The trick here is to recognize that 25 = 100 / 4. And in general, the trick with powers of 5 is to recognize that they are always some multiple of 10 divided by an integer. This tells us that 36 x 25 = 36 x 100 / 4. Since we can quickly figure out that 36 x 100 = 3,600, it's easy to find that 36 x 25 = 3,600 / 4 = 900.

Tip #2: Squaring Numbers Ending in 5
Our fun with 5s doesn't end there. We talked about how to square numbers in your head before, but it turns out that things get a whole lot easier when squaring a two-digit number that ends in 5. Here's the trick: Any time you square a two-digit number that ends in 5, the last digits of the answer will be 25 and the digits before that are given by multiplying the first digit of the number by the number that's one greater.

Thursday, 17 October 2013

China is not ready to take America's place

Beijing may complain about Washington, but its reliance on American debt stems from the China’s own economic policies

The Chinese sure are doing a lot of worrying these days about the stalemate in Washington. Li Keqiang, China’s Premier, told U.S. Secretary of State John Kerry that he was watching the tussle over raising the government’s debt ceiling with “great attention” in a meeting last week. He has good reason to be concerned. With a stash of nearly $1.3 trillion in Treasury securities, China is the world’s largest foreign owner of U.S. government debt. If U.S. Congress fails to lift the ceiling to allow the government to borrow more by Thursday, Washington may not have enough money to pay its bills, potentially leading to a default. That could sink the value of Treasuries — wiping out a big chunk of Chinese wealth in the process.

That possibility has caused much consternation in China. In a blistering (and highly hypocritical) editorial, state news agency Xinhua blasted what it sees as Washington’s irresponsibility in handling global affairs and called for greater say for developing nations in international institutions like the IMF and a new reserve currency to replace the dollar.

“As U.S. politicians of both political parties are still shuffling back and forth between the White House and the Capitol Hill without striking a viable deal to bring normality to the body politic they brag about, it is perhaps a good time for the befuddled world to start considering building a de-Americanized world,” the commentary recommended. “Such alarming days when the destinies of others are in the hands of a hypocritical nation have to be terminated, and a new world order should be put in place.”

Among the Chinese public, the stalemate in Washington has caused confusion and ire. Why, some Chinese are asking, have our leaders invested so much of the country’s money in a government that seems so dysfunctional? “Bought so much [American debt], now you are under the control of others,” went one typical comment posted on microblogging site Sina Weibo. “We should find out who made this decision and let him take the responsibility.”

The Chinese can blame themselves. Since the earliest days of Chinese economic reform, policies that the government has employed to create growth and exports have also made it dependent on debt issued by the U.S. Treasury. Those policies have generated huge current-account surpluses and gargantuan reserves of foreign currency that have left Beijing no other option but to invest in the U.S.

Chinese policy has generally pushed exports while discouraging imports. By controlling the value of its currency, the renminbi (RMB), to promote exports, China hasn’t allowed its exchange rate to adjust to shifts in trade in a way that would bring balance. Economist Huang Yiping once proffered that policies that reduce prices of land, energy and other costs of production also subsidize exports, and thus contribute to surpluses. Meanwhile, the government’s regulation of interest rates has favored investment and punished savers, suppressing domestic consumption.

The current-account surpluses China has notched over the years have resulted in a vault full of foreign-currency reserves — a staggering $3.66 trillion at last count. Though China’s surpluses have been declining (relative to GDP), the country is still adding to this mountain of foreign currency. In the third quarter, China’s foreign-exchange reserves jumped by the largest amount in more than two years.

To many, this ocean of foreign currency shows China’s economic strength, but at the same time, it is also a financial burden. Chinese policymakers simply don’t have many options when managing these giant reserves, and that has forced them to gorge on Treasuries. The U.S.-government-bond market is deep, liquid and reliable — the perfect (and, arguably, only) place to park all those greenbacks. Sure, the Chinese can switch some of their dollars into other currencies, but there is a limit to that strategy. Dumping the dollar would depress its value, eroding China’s own holdings. The only way for China to wean itself off its Treasury habit is to change its entire economic system.

That, though, is happening slowly. One strategy China is pursuing to lessen its dollar dependence is by promoting its own currency as an alternative to the greenback in global trade and finance. The government has had some success. The European Central Bank and China’s central bank recently agreed to a large swap of their currencies. And according to a recent survey from the Bank for International Settlements, the RMB entered the list of top 10 most traded currencies for the first time. Yet in order for the RMB to become a true rival to the dollar, China has to undertake far more reform.

The RMB isn’t fully convertible, nor does it trade freely around the world like the dollar, euro or yen. China is taking stabs at the sort of financial liberalization that would give the RMB an international boost — experimenting with freer capital flows in a new zone in Shanghai, for instance — but those steps are tentative at best. The Chinese government is still reluctant to throw open its financial sector and loosen capital flows and currency trading in a way that would turn the RMB into a solid reserve currency like the dollar.

“China’s policymakers remain deeply uncomfortable with allowing market forces a say in determining the exchange rate at times of uncertainty,” research firm Capital Economics said in a report on Monday. “Policymakers still see opening of capital controls as an important goal. But their actions underline that it remains a long way off.”

What this all means is that China and the U.S. Treasury remain locked in an embrace from which it is very hard for Beijing to escape. What it will take is extensive reform to China’s own economy that so far Beijing has been reluctant to undertake. So Beijing can call for a “de-Americanized world” all it wants. China is not ready to take America’s place.

Friday, 23 August 2013

If You Want Secure E-mail, Don’t Write It or Send It

When Lavabit—an e-mail service used by National Security Agency leaker Edward Snowden—suspended service last week amid hints that it had received a government demand for information, a competing service called Silent Circle made a draconian decision: to obliterate all of its customers’ stored e-mail.

The episode pointed out two fundamental weaknesses in e-mail. First, even if an e-mail service encrypts messages for secrecy, as Lavabit and Silent Circle did, the e-mail headers and routing protocols reveal who the senders and receivers are, and that information can be valuable in its own right. And second, the passcodes used as keys to decrypt messages can be requested by the government (if held by the e-mail company) or simply stolen by sophisticated malware.

When e-mail was created 40 years ago, security or anonymity wasn’t part of the design. The routing and labeling protocols plainly state what computer sent it or forwarded it, what computer received it, and what time all this happened. “There are far too many leaks of information and metadata intrinsically in the e-mail protocols themselves,” says Mike Janke, CEO of Silent Circle, whose customers include people in companies and government agencies with secrets to protect. “It doesn’t matter what you try to do with e-mail, there are these inherent weaknesses. So we got rid of Silent Mail [the company’s e-mail service]. We deleted all of it, burned it, and threw it in the ocean with locks and chains on it. People lost all their e-mail, but the response went from ‘Why would you do this?’ to ‘Thanks for doing this.’ “

Lavabit and Silent Circle and some other providers have offered a straightforward proposition: they will keep your e-mail encrypted at all times, except when you are reading and writing it on your own computer. This is in contrast to services like Gmail, which encrypts e-mail only for the trip over the network but stores the messages “in the clear” in its servers and mines that data to serve you ads.

Lavabit’s founder, Ladar Levinson, says he suspended operations rather than be “complicit in crimes against the American people.” Levinson could not be reached for comment but told the New York Times that he was under a gag order, implying that he received a National Security Letter, in which the FBI or NSA demands information for an investigation relevant to national security and requires the recipient to not reveal even having received the letter. In contrast to Silent Circle, the Lavabit data has not been deleted, he says.

Janke says that news triggered an emergency conversation with Phil Zimmermann, a Silent Circle founder who in 1991 created the e-mail encryption protocol known as PGP for “pretty good privacy” (see “An App Keeps Spies Away from Your iPhone”). “Once we saw what happened with Lavabit, we realized it wasn’t days, it was hours that we had to make a decision,” Janke says. But he adds that he never did receive a request.

The problem—besides the metadata that accompanies all e-mail—was that 98 percent of Silent Mail customers opted to let Silent Circle hold the encryption keys, which made using the service much easier. When users manage their own keys, they have to log into a special system to exchange cryptographic keys with each person they want to e-mail with. By possessing the keys to manage this process, the company could decrypt the messages if forced to. “If we got a legitimate request, we could in fact turn it over,” Janke says (see “NSA Chief Says U.S. Phone and Web Surveillance Sets Standard for Other Countries”).

Silent Circle remains in business, because fewer than 5 percent of its customers were using the now-deleted mail service. Most of them use other Silent Circle services that encrypt phone, text, and video content. This allows users to, for example, send an encrypted file via text message and even attach a time limit so that it will be deleted from both the sending and receiving devices after some period.

Yet these services also can be undermined by malware that can steal encryption keys stored on computers or grab data that has been decrypted by the user. “It is very difficult to be malware-protected,” says Radu Sion, a computer scientist and security expert at Stony Brook University. “A highly determined adversary—I don’t want to say the government here—will have access to any machine in the world.”

Existing e-mail services could become a little more private by encrypting header information. The techniques are well understood, but there is limited demand for them, Sion says. “The public is not asking for it since people don’t care about privacy, really,” he says. “And the cloud e-mail providers make lots of money by mining your messages.”

Meanwhile, Silent Circle is working on replacing its defunct e-mail service with a system that doesn’t rely on traditional e-mail protocols and keeps no messages or metadata within the company’s grasp. It is based on a protocol often used for instant messages and other applications. Janke says the goal is for this to not be e-mail, but “for all intents and purposes it looks, feels, and acts like e-mail.”